簡體   English   中英

MySQL:僅返回平面/對話消息表中的最后一條消息

[英]MySQL: Return only last message in flat/conversation message table

我正在編寫一個消息系統,比如 Facebook 的新消息系統,其中兩個用戶之間的整個來回都被視為一次對話。 (與傳統電子郵件不同,其中每個回復都是單獨的消息或 gMail 的對話,其中回復都在一個對話中,但您仍然可以在人與人之間進行多個對話)。 MySQL 版本是 5.0.92。

我一生都無法弄清楚如何為“收件箱”類型視圖編寫查詢。 我只需要兩個人之間的最后一條消息,這很容易,除非我不知道如何同時考慮“from_id”和“to_id”字段。

我的消息表如下所示:消息表

突出顯示的行是我想要返回的行(例如,#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`));
SELECT MAX(message_id) FROM messages GROUP BY GREATEST(to_id, from_id), LEAST(to_id, from_id);

如果你想要消息本身,你可以把它放在一個子選擇中,或者把它變成一個視圖並加入消息。

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)))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM