Php 选择最后一个不同的对

Php 选择最后一个不同的对,php,mysql,Php,Mysql,好的,我们有一个收件箱表,我们保存用户发送给彼此的消息。这是表格: 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` date

好的,我们有一个收件箱表,我们保存用户发送给彼此的消息。这是表格:

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,信息发送的时间。我们需要的是一个查询,它将返回“我们的用户”(管理员)未回复的所有消息。 表accounts跟踪用户。要简化:

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;
因此,基本上,我们需要一个查询,该查询为我们提供管理员(我们的用户)未回复其消息的用户、他们的数量以及他们发送给管理员的最后一条消息的日期,从最后一条到最早的顺序

到目前为止,我们只有一些基本的问题,我们没有提出任何合理的,我可以张贴

提前谢谢

编辑:据我所见,我们首先需要在收件箱表中找到来自两个不同用户的最后一次交互。。。然后只检查并过滤那些发送给我们用户的内容

这个怎么样

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);
使用
连接的另一种方法是:

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;
选择不同的i1。*
作为i1从收件箱左加入作为i2的收件箱
关于i1.toid=1和
i1.fromid=i2.toid和
i1.toid=i2.fromid和

i1.`time`下面给出了两种可能的解决方案:
左连接
解决方案应该表现得更好

左连接解决方案

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;

解释这两个表之间的关系。如果可能,发布一些示例输入输出,accounts表将存储所有用户。值为1的用户是管理员。在另一个表(收件箱)中是用户之间的消息。嗨,迪伦。i1是未知的。我尝试了>=I.
time
,现在查询被锁定,需要相当长的时间,我猜这不是您想要的:-)您应该添加一个帐户连接,以检查发件人是否是管理员。好的,我尝试了。它似乎给了我不同的值,但是它没有过滤我们的用户-我不确定这一点:i1.toid=1您必须加入accounts表,至少要检查发送它的用户是否是管理员这很有趣。我尝试左键加入,但收到了id和未回复邮件的数量。我看到的唯一问题是,它们是按id排序的,而不是按最后一条消息发送的时间排序的-有没有办法做到这一点?嗯,还有另一个问题。似乎此查询正在筛选不是邮件发送到的管理员的用户,而不是那些有未答复邮件的用户。我更新了答案,以便根据上次未答复的邮件获得有序的结果集。至于最后一个注释,结果实际上被过滤,只考虑从管理员发送的消息(我们的1),还没有被用户回答。它应该是另一种方式-只考虑从用户发送的消息(我们的= 0)还没有被管理员回答…请再次阅读您的问题:“因此,基本上,我们需要一个查询,该查询为我们提供有来自管理员(我们的用户)的未答复消息的用户及其数量。”您能否澄清需要检索哪些数据?