Я хочу сделать этот запрос:
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
, он тоже отлично работает. Дело в том, что я хочу выбрать строки, где целевой идентификатор источника ИЛИ равен 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 ...
Здесь один из способов, предполагая там не более одной строки с тем же 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 * не будет делать.
1010
). Это сделает его правильно отформатированным, цветным, и МНОГО будет легче читать.