Использую для хранения личных сообщений одну таблицу такого формата:
в таблице хранится id отправителя и id получателя, второй таблицы для хранения диалогов нет.
CREATE TABLE `v_user_messages` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(10) unsigned NOT NULL,
`receiver_id` int(10) unsigned NOT NULL,
`creation_datetime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`text` text NOT NULL,
`new` enum('0','1') NOT NULL,
PRIMARY KEY (`id`),
KEY `receiver_id` (`receiver_id`),
KEY `user_id_receiver_id` (`user_id`,`receiver_id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Пытаюсь получить в один запрос: id пользователя, с которым идёт диалог, и дату последнего сообщения, с сортировкой по дате. Ещё бы и количество строк (сообщений) между пользователями получить.
Вот что я пробовал:
/* выводит точно и без лишнего мусора, только не удаётся отсортировать */
(SELECT user_id
FROM `v_user_messages`
WHERE receiver_id = 1
GROUP BY user_id
ORDER BY creation_datetime DESC)
UNION (SELECT receiver_id
FROM `v_user_messages`
WHERE user_id = 1
GROUP BY receiver_id
ORDER BY creation_datetime DESC);
/* неправильно считает количество строк и не получается отсортировать */
SELECT a.id, b.id, a.user_id as user_id, b.user_id as receiver_id, COUNT(*)
FROM v_user_messages a, v_user_messages b
WHERE a.user_id = 1 AND b.user_id != 1
GROUP BY user_id, receiver_id;
/* выводит лишние строки */
SELECT *
FROM v_user_messages
WHERE user_id = 1 OR receiver_id = 1
GROUP BY user_id, receiver_id
ORDER BY creation_datetime DESC;