Я пишу систему обмена сообщениями, такую как новая система сообщений Facebook, где весь разговор между двумя пользователями считается одним разговором.(В отличие от традиционной электронной почты, где каждый ответ представляет собой отдельное сообщение или беседы gMail, в которых ответы объединяются в беседе, но вы все равно можете вести несколько бесед между людьми).Версия MySQL 5.0.92.
Не могу понять, как написать запрос для представления типа «Входящие».Все, что мне нужно, это самое последнее сообщение между двумя людьми, которое будет легко , за исключением того, что я не знаю, как принять во внимание оба поля "from_id" и "to_id".
Моя таблица сообщений выглядит следующим образом: ![messages table](https://i.stack.imgur.com/hq7cw.png)
Выделенные строки - это те, которые я хотел бы вернуть (# 2 не будет возвращено, поскольку последнее сообщение между пользователями 42 и 43 - # 8, дляпример).Можно ли сделать это?Или мне лучше использовать два запроса (один для to_id и один для from_id), а затем обрабатывать их в PHP?
Спасибо за вашу помощь
SQL для репликации таблицы:
CREATE TABLE `messages` (
`message_id` bigint(20) NOT NULL auto_increment,
`to_id` int(11) NOT NULL,
`from_id` int(11) NOT NULL,
`message_sent` datetime NOT NULL,
`message_body` text NOT NULL,
`is_read` tinyint(1) NOT NULL default '0' COMMENT '0 = no, 1 = yes',
PRIMARY KEY (`message_id`),
KEY `to` (`to_id`),
KEY `is_read` (`is_read`),
KEY `sent` (`message_sent`),
KEY `from` (`from_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `messages` (`message_id`, `to_id`, `from_id`, `message_sent`, `message_body`, `is_read`) VALUES
(1, 42, 43, '2011-04-01 11:54:05', 'message 1', 0),
(2, 43, 42, '2011-04-01 11:54:05', 'message 1.2', 0),
(3, 42, 44, '2011-04-01 11:55:05', 'message 2', 1),
(4, 44, 42, '2011-04-01 11:55:02', 'message 2.1', 0),
(5, 43, 44, '2011-04-01 15:05:42', 'Message 3', 0),
(6, 44, 43, '2011-04-01 15:05:58', 'Message 3.1', 0),
(7, 42, 43, '2011-04-02 11:54:05', 'message x', 0),
(8, 43, 42, '2011-04-02 11:54:05', 'message x.2', 0);
Редактировать: для заинтересованных:
select `m`.`message_id` AS `message_id`,`m`.`to_id` AS `to_id`,`ut`.`name` AS `to_name`,`m`.`from_id` AS `from_id`,`uf`.`name` AS `from_name`,`m`.`message_sent` AS `message_sent`,`m`.`message_body` AS `message_body`,`m`.`is_read` AS `is_read` from ((`messages` `m` join `users` `ut` on((`m`.`to_id` = `ut`.`id`))) join `users` `uf` on((`m`.`from_id` = `uf`.`id`))) where `m`.`message_id` in (select max(`messages`.`message_id`) AS `MAX(message_id)` from `messages` group by greatest(`messages`.`to_id`,`messages`.`from_id`),least(`messages`.`to_id`,`messages`.`from_id`));