MySQL 'OR' not working
I want to do this query:
SELECT *
FROM mail
WHERE tag_draft = 0
AND (target_id = 2 OR source_id = 2)
GROUP BY created DESC`
...but it returns no rows. Now, if I do this query:
SELECT *
FROM mail
WHERE tag_draft = 开发者_开发知识库0
AND target_id = 2
GROUP BY created DESC
...then it works fine - every row with a target_id
of 2 is selected. If I substitute target_id
with source_id
, it works fine too. The thing is, I want to select rows where the target OR source ID is 2 (2 used as an example here), however running the query first stated
(SELECT * FROM mail WHERE tag_draft=0 AND (target_id=2 OR source_id=2) GROUP BY created DESC
)
Some example data:
source_id target_id etc_fields
-------------------------------
2 12 blah
12 2 blah
2 14 blah
2 10 blah
2 2 blah
All the above rows should be displayed in the table. what should NOT be displayed is stuff like:
source_id target_id etc_fields
-------------------------------
10 8 ...
255 16 ...
4 12 ...
Here's one way, assuming there's there's not more than one row with the same MAX(created) for the given condition:
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))
Or perhaps just
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
Make sure you GROUP BY every column that you select, except the aggregate ( MAX(created) ) , SELECT * won't do.
精彩评论