SQL запрос диалоги со всеми пользователями

B
На сайте с 14.04.2012
Offline
35
1205

Есть поля в аттаче. Необходимо вывести последние сообщения из всех диалогов.

Т.е user1=с id 1 и user2=с id 2 , то если строка в таблице будет user1=с id 2 и user2=с id 1 это один и тот же диалог. И мне нужно вывести из каждой такой возможной пары последнее сообщение. Как это можно сделать?

png Untitled.png
B
На сайте с 14.04.2012
Offline
35
#1

при этом мы знаем только id юзера который залогинен.

Hixon10
На сайте с 21.08.2010
Offline
125
#2

В нормальных СУБД мы бы использовали оконные функции (Window Functions). В майсиквел у нас этого нет, поэтому нужно использовать вложенные запросы.

Веду свой невзрачный блог (http://hixon.ru/).
[umka]
На сайте с 25.05.2008
Offline
456
#3

Примерно так:

SELECT *, MAX(`date`) FROM `messages` WHERE `user1`='$user_id' OR `user2`='$user_id' GROUP BY CONCAT(LEAST(`user1`,`user2`),'-',GREATEST(`user1`,`user2`))

Этот CONCAT используется для того, чтобы создать уникальный идентификатор для диалогов между всеми парами пользователей. Точнее, парами пользователя $user_id с другими пользователями.

Например, у всех сообщений между пользователем 123 и пользователем 456 будет вычислен некий уникальный id (вида "123-456"), по которому мы группируем и берём последнее (по дате) сообщение.

Чтобы снизить вычислительную нагрузку, целесообразнее добавить в таблицу ещё один столбец и записывать в него такой идентификатор в момент добавления сообщений.

Hixon10:
В нормальных СУБД мы бы использовали оконные функции (Window Functions). В майсиквел у нас этого нет, поэтому нужно использовать вложенные запросы.

Майсиквел? Хмм… никогда о такой не слышал. Наверное, это действительно какая-то ненормальная СУБД.

Лог в помощь!
Станислав
На сайте с 27.12.2009
Offline
258
#4
'[umka:
;13399760']
Майсиквел? Хмм… никогда о такой не слышал. Наверное, это действительно какая-то ненормальная СУБД.

Я майсиквел не юзаю, но в майприквел тоже такого нет.

Мы там, где рады нас видеть.
Hixon10
На сайте с 21.08.2010
Offline
125
#5
[umka:
Майсиквел? Хмм… никогда о такой не слышал. Наверное, это действительно какая-то ненормальная СУБД.

MySQL (/maɪ ˌɛskjuːˈɛl/ "My S-Q-L", officially, but also called /maɪ ˈsiːkwəl/ "My Sequel") 😕

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий