Как объединить GROUP BY и ORDER BY здесь? - PullRequest
1 голос
/ 24 июня 2019

У меня есть база данных с таблицей под названием «сообщения». Столбцы: «отправитель», «получатель», «субъект», «время» (отметка времени).

С помощью моего запроса я хочу получить записи, сгруппированные по теме. НО Я хочу иметь соответствующее время, чтобы быть самым последним.

Так, например, если это был мой БД:

person1   |   person2   |   hello   |   2019-06-24 20:0**7**:00
person2   |   person1   |   hello   |   2019-06-24 20:0**8**:00

Я хочу получить это:

subject: hello
last entry: 2019-06-24 20:0**8**:00

Мне не удалось поместить ORDER BY перед GROUP BY, поэтому я попытался выполнить подзапрос:

SELECT subject, sender, receiver, time
FROM 
    (SELECT subject, sender, receiver, time
     FROM messages
     ORDER BY time DESC) AS subselect
GROUP BY subject

Но это не работает, и я не могу понять, почему.

Может кто-нибудь мне помочь?

Ответы [ 2 ]

0 голосов
/ 24 июня 2019
SELECT subject,sender,reseiver,max(time) 
FROM messages
GROUP BY subject,sender,reseiver
ORDER BY max(time) DESC

Вы должны сгруппировать по отправителю и получателю, иначе эти столбцы имеют непредсказуемое значение.Или полностью пропустите этот столбец.

0 голосов
/ 24 июня 2019

Я считаю, что это то, что вы ищете:

SELECT subject,sender,reseiver, MAX(time) AS time FROM messages GROUP BY subject

Итак, это работает так:

  1. Получает соответствующие записи (в данном случае - все они, поскольку WHERE не предоставлено)
  2. Группирует их по столбцу subject, поэтому теперь у нас есть группы записей с одинаковой темой
  3. В каждой группе она ищет максимальное значение time column - но это для каждой группы, так что, я думаю, это то, что вы хотели

И если вы хотите как-то отсортировать группы, просто добавьте еще один ORDER BY в конце, без каких-либо подзапросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...