MySQL “Group By” и “Order By”

Я хочу смочь выбрать набор строк от таблицы электронных писем и сгруппировать их от отправителя. Мой запрос похож на это:

SELECT 
    `timestamp`, `fromEmail`, `subject`
FROM `incomingEmails` 
GROUP BY LOWER(`fromEmail`) 
ORDER BY `timestamp` DESC

Запрос почти работает, поскольку я хочу его — он выбирает записи, сгруппированные электронной почтой. Проблема состоит в том, что предмет и метка времени не соответствуют новой записи для конкретного адреса электронной почты.

Например, это могло бы возвратиться:

fromEmail: john@example.com, subject: hello
fromEmail: mark@example.com, subject: welcome

Когда записи в базе данных:

fromEmail: john@example.com, subject: hello
fromEmail: john@example.com, subject: programming question
fromEmail: mark@example.com, subject: welcome

Если "предмет" вопроса о программировании нов, как я могу заставить MySQL выбирать ту запись при группировке электронных писем?

92
задан dreftymac 28 June 2019 в 20:42
поделиться

2 ответа

В соответствии со стандартом SQL вы не можете использовать неагрегированные столбцы в списке выбора. MySQL допускает такое использование (если не используется режим ONLY_FULL_GROUP_BY), но результат непредсказуем.

ONLY_FULL_GROUP_BY

Вы должны сначала выбрать fromEmail, MIN (чтение), а затем во втором запросе (или подзапросе) - Subject.

21
ответ дан 24 November 2019 в 06:25
поделиться

Вот один из подходов:

SELECT cur.textID, cur.fromEmail, cur.subject, 
     cur.timestamp, cur.read
FROM incomingEmails cur
LEFT JOIN incomingEmails next
    on cur.fromEmail = next.fromEmail
    and cur.timestamp < next.timestamp
WHERE next.timestamp is null
and cur.toUserID = '$userID' 
ORDER BY LOWER(cur.fromEmail)

По сути, вы присоединяете таблицу к самой себе, ища более поздние строки. В предложении where вы указываете, что не может быть более поздних строк. Это дает вам только последнюю строку.

Если может быть несколько электронных писем с одной и той же меткой времени, этот запрос потребует уточнения. Если в таблице электронной почты есть столбец инкрементного идентификатора, измените СОЕДИНЕНИЕ, например:

LEFT JOIN incomingEmails next
    on cur.fromEmail = next.fromEmail
    and cur.id < next.id
42
ответ дан 24 November 2019 в 06:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: