У меня есть таблица «сообщений», где пользователи отправляют и получают сообщения, довольно просто. То, что я хотел бы сделать: получить DISTINCT sender_ids, ГДЕ receive_id это X, и отсортировать его таким образом, чтобы сначала появлялись пользователи, у которых получатель X имел непрочитанные сообщения, а затем появлялись пользователи, у которых получатель X прочитал сообщения, и все сортировалось made_at DESC.
Есть идеи, как мне это сделать? Примечание. Производительность также является проблемой.
Это запрос, который я использовал, но похоже, что сортировка на самом деле не выполнена правильно, возможно, DISTINCT все испортил? Я ожидаю результата 6, 5, 4, 2, 3 - но получаю 6, 5, 4, 3, 2
SELECT DISTINCT sender_id
FROM message m
WHERE receiver_id = 1
ORDER BY read_at, created_at DESC
Вот таблица с образцами данных:
CREATE TABLE `message` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`sender_id` bigint(20) NOT NULL,
`receiver_id` bigint(20) NOT NULL,
`message` text,
`read_at` datetime DEFAULT NULL,
`created_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `sender` (`sender_id`),
KEY `receiver` (`receiver_id`),
KEY `dates` (`receiver_id`,`read_at`,`created_at`)
) ENGINE=MyISAM AUTO_INCREMENT=13 DEFAULT CHARSET=latin1;
INSERT INTO `message` (id, sender_id, receiver_id, message, read_at, created_at)
VALUES
(1,2,1,NULL,'2011-01-01 01:01:01','2011-01-01 01:01:01'),
(2,1,2,NULL,'2011-01-01 01:01:01','2011-01-01 01:01:02'),
(3,2,1,NULL,'2011-01-01 01:01:01','2011-01-01 01:01:03'),
(4,3,1,NULL,'2011-01-01 01:01:01','2011-01-01 01:01:04'),
(5,3,1,NULL,'2011-01-01 01:01:01','2011-01-01 01:01:05'),
(6,1,4,NULL,'2011-01-01 01:01:01','2011-01-01 01:01:06'),
(7,4,1,NULL,NULL,'2011-01-01 01:01:07'),
(8,5,1,NULL,NULL,'2011-01-01 01:01:08'),
(9,5,1,NULL,NULL,'2011-01-01 01:01:09'),
(10,1,6,NULL,NULL,'2011-01-01 01:01:10'),
(11,6,1,NULL,NULL,'2011-01-01 01:01:11');