[英]mysql select last entry for ids pair
我想使用mysql實現存儲的消息系統。
這是表:
CREATE TABLE `message` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`id_from` int(10) unsigned NOT NULL,
`id_to` int(10) unsigned NOT NULL,
`time` datetime NOT NULL,
`message` varchar(200) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
);
id_from是味精發送方,id_to是味精接收方。
下面插入4條消息進行測試:
INSERT INTO `message`(`id`,`id_from`,`id_to`,`time`,`message`) VALUES
(1,1,2,'2012-07-05 12:18:49','msg1'),
(2,2,1,'2012-07-05 12:18:58','msg2'),
(3,3,1,'2012-07-05 12:19:04','msg3'),
(4,1,3,'2012-07-05 12:19:10','msg4');
我想做的但沒有成功的事,是建立一個查詢,以為特定用戶獲取每對消息對(id_from,id_to)的最后發送或接收的消息。 在這種情況下,結果將是:
row1: 2,2,1,'2012-07-05 12:18:58','msg2'
row2: 4,1,3,'2012-07-05 12:19:10','msg4'
選擇* FROM消息,其中id_from = 1或id_to = 1?
SELECT id, id_from, id_to, time, message
FROM ( SELECT
FROM message
WHERE 1 IN (id_from, id_to) # 1 is user_id in this case
ORDER BY time DESC) AS h
GROUP BY LEAST(id_from, id_to), GREATEST(id_from, id_to)
獲取最后發送和接收的消息的解決方案 (雖然不是要求的內容)
SELECT id, id_from, id_to, time, message
FROM ( SELECT
FROM message
WHERE 1 IN (id_from, id_to) # 1 is user_id in this case
ORDER BY time DESC) AS h
GROUP BY id_from, id_to
我猜應該這樣做。
我確定有“更漂亮”的格式可以捕捉到它。
考慮:
SELECT id, 'from' AS type, id_from AS type_id, time, message
FROM message
WHERE id_to = 1
ORDER BY time DESC
LIMIT 1
UNION ALL
SELECT id, 'to', id_to, time, message
FROM message
WHERE id_from = 1
ORDER BY time DESC
LIMIT 1
這將為您提供:
id type type_id time message
3 from 3 2012-07-05 12:19:04 msg3
4 to 3 2012-07-05 12:19:10 msg4
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.