MySQL «ИЛИ» не работает

0

Я хочу сделать этот запрос:

  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)

с внутренними скобками или без них, не возвращает строк. Я не могу понять, почему это не сработает, кроме того, что я делаю что-то неправильно с битом OR.

Некоторые данные примера:

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        ...
  • 2
    Не могли бы вы отформатировать это немного лучше? Поместите ваши запросы в свои собственные абзацы с отступом в 4 пробела (или выберите и нажмите кнопку 1010 ). Это сделает его правильно отформатированным, цветным, и МНОГО будет легче читать.
  • 4
    Можете ли вы предоставить определение таблицы и несколько строк примеров данных, которые воспроизводят проблему воспроизводимым способом?
Показать ещё 8 комментариев
Теги:

1 ответ

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 * не будет делать.

  • 0
    Это выглядит многообещающе, хотя я идиот и недостаточно прояснил свой вопрос :( У меня есть «потоки», обозначенные столбцом thread_id, который одинаков для всех строк в этом потоке. У меня также есть созданный дата для потока, опять же, все та же. Чем отличается поле «обновлено» - оно уникально. Сможете ли вы изменить свой запрос так, чтобы он вел себя так, как я объяснил, или он уже?
  • 0
    Кроме того, что значит «м.» и "см." значит? это разные таблицы или что-то?
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню