MySQL: вернуть только последнее сообщение в таблице сообщений / разговора - PullRequest
2 голосов
/ 01 апреля 2011

Я пишу систему обмена сообщениями, такую ​​как новая система сообщений Facebook, где весь разговор между двумя пользователями считается одним разговором.(В отличие от традиционной электронной почты, где каждый ответ представляет собой отдельное сообщение или беседы gMail, в которых ответы объединяются в беседе, но вы все равно можете вести несколько бесед между людьми).Версия MySQL 5.0.92.

Не могу понять, как написать запрос для представления типа «Входящие».Все, что мне нужно, это самое последнее сообщение между двумя людьми, которое будет легко , за исключением того, что я не знаю, как принять во внимание оба поля "from_id" и "to_id".

Моя таблица сообщений выглядит следующим образом: messages table

Выделенные строки - это те, которые я хотел бы вернуть (# 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`));

Ответы [ 2 ]

5 голосов
/ 02 апреля 2011
SELECT MAX(message_id) FROM messages GROUP BY GREATEST(to_id, from_id), LEAST(to_id, from_id);

Если вам нужны сами сообщения, вы можете поместить их в подвыбор или превратить в представление и объединить с сообщениями.

0 голосов
/ 02 апреля 2011
select * from messageTable 
where message_id in 
(select max(message_id) from messageTable where from_id = yourFromId and to_id = yourToId)

Обновлено

select * 
from messageTable 
where (message_id in 
       (select max(message_id) from messageTable where from_id = yourFromId and to_id = yourToId))
    or (message_id in 
       (select max(message_id) from messageTable where from_id = yourToId and to_id = yourFromId)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...