代码之家  ›  专栏  ›  技术社区  ›  Bojangles Vincent Baillet

mysql'或'不工作'

  •  0
  • Bojangles Vincent Baillet  · 技术社区  · 15 年前

    我想做这个查询:

      SELECT * 
        FROM mail 
       WHERE tag_draft = 0 
         AND (target_id = 2 OR source_id = 2) 
    GROUP BY created DESC`
    

    …但它不返回任何行。现在,如果我做这个查询:

      SELECT * 
        FROM mail 
       WHERE tag_draft = 0 
         AND target_id = 2 
    GROUP BY created DESC
    

    …然后就可以了-每排 target_id 选择2个。如果我替代 塔吉特 具有 source_id 也可以。问题是,我想选择目标所在的行 源ID为2(此处使用2作为示例),但首先声明的是运行查询

    ( SELECT * FROM mail WHERE tag_draft=0 AND (target_id=2 OR source_id=2) GROUP BY created DESC )

    不返回任何行。我不明白为什么这不起作用,除了我对或位做了一些错误。

    一些示例数据:

    source_id target_id etc_fields
    -------------------------------
    2         12        blah
    12        2         blah
    2         14        blah
    2         10        blah
    2         2         blah
    

    上述所有行都应显示在表中。不应该显示的内容如下:

    source_id target_id etc_fields
    -------------------------------
    10        8         ...
    255       16        ...
    4         12        ...
    
    1 回复  |  直到 15 年前
        1
  •  1
  •   nos    15 年前

    这里有一种方法,假设给定条件下不存在多个具有相同max(created)的行:

    SELECT m.* FROM mail m WHERE m.tag_draft=0 AND (m.target_id=2 OR m.source_id=2) AND
      m.created = (SELECT MAX(created) FROM mail sm 
           WHERE sm.tag_draft=0 AND (sm.target_id=2 OR smsource_id=2))
    

    或者也许只是

     SELECT m.id,m.target_id,m,m.source_id,MAX(created) FROM mail m 
        WHERE m.tag_draft=0 AND (m.target_id=2 OR m,source_id=2) 
      GROUP BY m.id,m.target_id,m.source_id
    

    确保按所选的每一列分组,但聚合(max(created))除外,select*不会这样做。