簡體   English   中英

選擇最后一個不同的對

[英]Select last distinct pair

好的,我們有收件箱表,用於保存用戶彼此發送的消息。 表格如下:

CREATE TABLE IF NOT EXISTS `inbox` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`fromid` int(10) unsigned NOT NULL DEFAULT '0',
`toid` int(10) DEFAULT NULL,
`message` text CHARACTER SET utf8 NOT NULL,
`time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
KEY `toid` (`toid`),
KEY `fromid` (`fromid`),
KEY `fromid_2` (`fromid`,`toid`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1  ;

fromid和toid是用戶的ID。 我們有他們的ID,即消息發送的時間。 我們需要一個查詢,該查詢將返回“我們的用戶”(管理員)未答復的所有消息。 表帳戶跟蹤用戶。 為了簡化:

CREATE TABLE IF NOT EXISTS `accounts` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`our` int(1) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1;

因此,基本上,我們需要一個查詢,該查詢為用戶提供管理員(我們的用戶)不應答的消息,其計數和發送給ADMIN的最后一條消息的日期(從最后到最早)。

到目前為止,我們只有一些基本查詢,沒有提出我可以發布的任何合理信息。

提前致謝。

編輯:從我所看到的,我們首先需要在收件箱表中查找來自兩個DISTINCT用戶的最后一次交互...然后檢查並僅過濾發送給我們用戶的那些

這個怎么樣?

SELECT i.* FROM inbox as i 
WHERE (i.toid, i.fromid) NOT IN 
(SELECT i2.fromid, i2.toid FROM inbox as i2 WHERE i2.`time` >= i1.`time` AND i2.id = 1);

另一種使用join

SELECT DISTINCT i1.* 
FROM inbox as i1 LEFT JOIN inbox as i2 
    ON  i1.toid = 1 AND 
        i1.fromid = i2.toid AND 
        i1.toid = i2.fromid AND 
        i1.`time` <= i2.`time`
WHERE i2.id IS NULL;

下面介紹了兩種可能的解決方案: LEFT JOIN解決方案應該表現更好。

左聯接解決方案

SELECT 
 i.fromid, COUNT(*) AS unread, MAX(i.time) AS lastmsg 
FROM inbox AS i 
INNER JOIN accounts AS a 
 ON i.toid = a.id 
LEFT JOIN inbox AS i2 
 ON i.fromid = i2.toid AND i.toid = i2.fromid AND i.time <= i2.time 
WHERE a.our = 1 AND i2.id IS NULL
GROUP BY i.fromid
ORDER BY lastmsg DESC;

不在解決方案中

SELECT 
 i.fromid, COUNT(*) AS unread, MAX(i.time) AS lastmsg
FROM inbox AS i 
INNER JOIN accounts AS a ON i.toid = a.id 
WHERE a.our = 1 AND 
 (i.toid, i.fromid) 
 NOT IN (SELECT i2.fromid, i2.toid FROM inbox AS i2 WHERE i2.time >= i.time) 
GROUP BY i.fromid
ORDER BY lastmsg DESC;

暫無
暫無

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

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