В PostgreSQL я хочу получать сразу всех пользователей и заказывать их по дате.
Это мой запрос:
SELECT id, useridx, isread, message, date
FROM messages
WHERE isread = 1
GROUP BY useridx
ORDER BY date DESC
Это пример данных:
------------------------------------------------------
+ id | useridx | isread | messsage | date +
------------------------------------------------------
1 | 1 | 0 | Hello | 2012-01-01
2 | 2 | 1 | Hi | 2012-01-02
3 | 3 | 1 | Test | 2012-01-03
4 | 3 | 0 | My Msg | 2012-01-04
5 | 4 | 1 | sadasd | 2012-01-05
6 | 4 | 1 | sdfsdfd | 2012-01-06
7 | 4 | 0 | sdfsdfsd | 2012-01-07
8 | 5 | 0 | 5345634 | 2012-01-08
9 | 6 | 0 | sdfdfsd | 2012-01-09
10 | 7 | 0 | sdfsdfsf | 2012-01-10
------------------------------------------------------
Теперь, что я хочу сделать, это получить эту таблицу, группируя их через useridx и упорядочивая по дате.
Ожидаемый результат:
------------------------------------------------------
+ id | useridx | isread | messsage | date +
------------------------------------------------------
6 | 4 | 1 | sdfsdfd | 2012-01-06
3 | 3 | 1 | Test | 2012-01-03
2 | 2 | 1 | Hi | 2012-01-02
------------------------------------------------------
Фактический результат
ERROR: column "messages.date" must appear in the GROUP BY clause or be used in an aggregate function
Я тоже не хочу группировать дату. Я просто хочу сгруппировать с useridx и отсортировать их по дате DESC.
Любая помощь/идея оценена!
Примечание. Я также попробовал Distinct. Не соответствует моим потребностям, или я сделал это неправильно.
Я очень смущен и застрял между методами DISTINCT ON
и rank()
.
Вывод: для тех, кто получает ту же проблему, здесь можно прочитать это как ответ. Оба @kgrittn и @mu слишком короткие ответы правильные. Я продолжу использовать оба ответа и схемы в своем проекте, и со временем я смогу понять, какой из них является лучшим -i guess-. Итак, выберите один из них и продолжайте свою работу. Вы будете в порядке.
Последнее обновление: иногда, Distinct On исключает некоторые идентификаторы из результата. Допустим, у меня есть столбец id, и у меня есть 6 строк, которые одинаковы. Итак, отличная от exlude это от результата BUT rank() просто результат. Итак, используйте rank()!