Страницы

Поиск по вопросам

вторник, 17 декабря 2019 г.

Группировка по двум колонкам

#mysql #sql


Есть таблица со списком сообщений на сайте, в которой имеются два столбца: Автор
и Получатель. Необходимо выбрать из таблицы все последние сообщения для заданного пользователя,
который может фигурировать как Автор, так и Получатель. Т.е. если мы находим 2 записи,
в первой пользователь является автором, а во второй с тем же самым собеседником является
получателем, то нам нужна только последняя запись.

Как это лучше сделать?
    


Ответы

Ответ 1



В MySQL можно сделать так: SELECT MSGs.* FROM MSGs JOIN ( SELECT CASE WHEN user_from < user_to THEN user_from ELSE user_to END id1, CASE WHEN user_from > user_to THEN user_from ELSE user_to END id2, MAX(send_time) max_time FROM MSGs --автор или получатель WHERE @UserId = user_from OR @UserId = user_to --группируем по двум столбцам GROUP BY CASE WHEN user_from < user_to THEN user_from ELSE user_to END, CASE WHEN user_from > user_to THEN user_from ELSE user_to END )T --соединяем по автору/получателю и времени сообщения ON send_time = max_time AND CASE WHEN user_from < user_to THEN user_from ELSE user_to END = id1 AND CASE WHEN user_from > user_to THEN user_from ELSE user_to END = id2 WHERE @UserId = user_from OR @UserId = user_to В MS SQL, Oracle, PG SQL было бы проще: SELECT user_from, user_to, send_time FROM( SELECT MSGs.*, ROW_NUMBER()OVER(PARTITION BY CASE WHEN user_from < user_to THEN user_from ELSE user_to END, CASE WHEN user_from > user_to THEN user_from ELSE user_to END ORDER BY send_time DESC ) N FROM MSGs --автор или получатель WHERE @UserId = user_from OR @UserId = user_to )T WHERE N=1

Комментариев нет:

Отправить комментарий