我想做这个查询:
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的每一行。如果我将target_id
替换为source_id
,它也可以正常工作。问题是,我想选择目标 OR 源ID为2的行(此处以2为例),但是先运行查询
({{1带或不带内括号的
,不返回任何行。我无法弄清楚为什么这不起作用,除了我对OR位做错了。
一些示例数据:
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
答案 0 :(得分:1)
这是一种方法,假设对于给定条件,存在不超过一行具有相同MAX(已创建)的行:
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
确保您选择的每个列都是GROUP BY,除了聚合(MAX(已创建)),SELECT *不会这样做。