набор результатов сообщений facebook, как

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

Результат должен содержать идентификатор последнего сообщения, идентификатор отправителя, дату и общее количество сообщений в этой теме.

Таблица сообщений может выглядеть следующим образом:

message
-------
id
sender_id
subject
created_at

Таким образом, результат должен отображать все сообщения пользователя, сгруппированные по одной теме.


person David    schedule 26.02.2010    source источник
comment
В качестве примера набора данных в таблице сообщений для небольшого числа пользователей и сообщений, не могли бы вы предоставить пример набора результатов, который вы хотели бы вернуть? На данный момент я не понимаю, как они должны быть сгруппированы вместе в вашем идеальном выводе.   -  person Kris C    schedule 02.03.2010


Ответы (1)


SELECT sender_ID, subject, MAX(id), MAX(created_at), COUNT (id) 
FROM message 
WHERE recipient_id = current_user_id OR sender_id = current_user_id
GROUP BY subject, sender_ID, receipient_id
ORDER BY MAX(created_at) DESC

С GROUP BY все, что не входит в предложение GROUP BY, должно быть в агрегатной функции (например, COUNT, SUM, MAX и т. д.) в операторе SELECT.

РЕДАКТИРОВАТЬ - понял, что приведенная выше группа не совсем делает то, что, как я думаю, вы хотите (хотя набор результатов примера поможет), поэтому кто-то подумал упростить это. Во время создания сообщения вы можете установить дополнительное значение столбца - chat_id. Этому будет присвоено новое значение при создании нового сообщения, а затем повторное использование для любых ответов. Затем вы можете сгруппировать по разговору_id, чтобы сгруппировать сообщения так, как я думаю, вы хотели бы, чтобы они были

person Kris C    schedule 26.02.2010
comment
Вы можете заказать по теме sender_ID - person TheSteve0; 28.02.2010
comment
ребята, сортировка по идентификатору отправителя не будет отображать сообщения от самых последних до самых старых ...? его нужно отсортировать по created_at, чтобы он отображал сообщения по дате, нет? - person David; 01.03.2010
comment
хорошо, это немного сложнее, чем я думал. В моем вопросе я не упомянул о получении только всех сообщений для определенного пользователя, поэтому нет пункта where. Если мы включим предложение where в sql следующим образом: где Receiver_id = current_user_id OR sender_id = current_user_id, тогда результат ТАКЖЕ выберет ту ЖЕ тему, но ДРУГОГО пользователя, который отправил сообщение текущему пользователю. Есть идеи? - person David; 01.03.2010
comment
Добавить current_user_id в группу тоже - person Kris C; 01.03.2010
comment
Большое спасибо за помощь. Но current_user_id — это переменная. так что это выглядит так: WHERE Receiver_id = #{current_user_id} OR sender_id = #{current_user_id}. Не получится поместить это в группу по предложению. - person David; 02.03.2010