Выделиться по одному столбцу, упорядочить по другому - PullRequest
0 голосов
/ 22 марта 2019

Я создаю функцию обмена сообщениями для приложения, моя таблица базы данных выглядит следующим образом:

messages:
  id
  senderId
  receiverId
  threadId   <-- every message is part of a thread
  createdAt

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

SELECT DISTINCT ON ("threadId") * FROM messages ORDER BY "createdAt" DESC;

Итак, я делаю DISTINCT ON ("threadId"), но я также выбираю все столбцы, потому что мне нужны все данные, поэтому есть * после предложения DISTINCT ON.До этого момента этот запрос работал нормально, но теперь он не выполняется по предложению ORDER BY.Я хочу вернуть сообщение, которое было создано последним, но я получаю сообщение об ошибке:

ERROR:  SELECT DISTINCT ON expressions must match initial ORDER BY expressions
LINE 1: SELECT DISTINCT ON ("threadId") * FROM messages order by "cr...

Я понимаю, что я думаю об ошибке (столбец ORDER BY должен соответствоватьстолбец, к которому применяется DISTINCT ON), но я не знаю, как сделать запрос таким, каким я хочу, который должен быть упорядочен по createdAt, прежде чем он станет отчетливым.

1 Ответ

2 голосов
/ 22 марта 2019

Ведущие выражения в ORDER BY должны согласовываться с выражениями в DISTINCT ON:

SELECT DISTINCT ON ("threadId") *
FROM   messages
ORDER  BY "threadId", "createdAt" DESC;

Подробное объяснение:


Если вы хотите упорядочить результаты по-другому (как прокомментировано), вам нужно будет обернуть запрос во внешний запрос вторым ORDER BY. См:

или аналогичный, в зависимости от вашей конкретной ситуации и требований. Там может быть изысканность, чтобы получить лучшие результаты. Недавний пример:

...