MySQL 收件箱查询返回双重结果

MySQL Inbox query returning double results

使用 PHP 和 MySQL,我正在创建一个收件箱消息传递系统并且它可以工作,但它在某种意义上是 returning 双打。收件箱应显示两个人之间的对话以及发送的最后一条消息。用户可以单击该最新消息并与用户聊天。现在,如果用户 1 向用户 2 发送消息,收件箱显示用户 1 发送的最新消息,如果用户 2 向用户 1 发送消息,则收件箱显示最新消息。如果用户 1 或用户 2 相互发送消息,我只想显示他们中的任何一个发送的最后一条消息。这是我的查询,我想自己做,但是我的 SQL 技能有点迟钝。

这是我的留言 table:

这是我的用户 table:

最后,这里是查询:

SELECT m.body, m.createddate,m.recuserid,m.createduserid,
    FROM( SELECT MAX(createddate) as maxdate 
     from 

     messages 

     group by recuserid,createduserid
    ) c 
inner join messages m on m.createddate = c.maxdate 
inner join users u on u.userid = m.createduserid 

WHERE createduserid = 143 OR recuserid = 143

这是 return 的结果:

如您所见,它return是任何以任何方式涉及用户 143 的消息。我想要的结果只是 return 第一行和第三行。

SELECT m.body, m.createddate,m.recuserid,m.createduserid,
    FROM ( SELECT MAX(createddate) as Maxdate, recuserID, createduserId
           FROM MESSAGES 
           GROUP BY recuserid,createduserid) c 
INNER JOIN messages m 
   on m.createddate = c.Maxdate 
  and m.RecUserID = C.RecuserId
  and m.CreateduserId = C.CreatedUserId
INNER JOIN users u 
   on u.userid = m.createduserid 
WHERE createduserid = 143 

您的 OR 语句导致第 2 行被 returned。正如@MarcB 在初始评论中所述。

然而,由于 date/time 上的可能匹配项,您应该 return 您分组的内容并将其添加到加入条件中..

也许您只想要用户发送或接收的最新消息....

SELECT m.body, m.createddate,m.recuserid,m.createduserid,
    FROM ( SELECT MAX(createddate) as Maxdate,  
           FROM MESSAGES
           where createdUserID =143 OR RecUserID = 143) c 
INNER JOIN messages m 
   on m.createddate = c.Maxdate 
INNER JOIN users u 
   on u.userid = m.createduserid 
WHERE createduserid = 143 

我想这就是你想要的:

SELECT m.`body`,
       MAX(m.`createddate`) AS maxcreateddate,
       m.`pairid`
FROM (SELECT `body`,
             `createddate`,
             CONCAT(`recuserid`,`createduserid`) as pairid
      FROM `messages`
      WHERE `recuserid`=143
    UNION
      SELECT `body`,
             `createddate`,
             CONCAT(`createduserid`,`recuserid`) as pairid
      FROM `messages`
      WHERE `createduserid`=143) as m
GROUP BY pairid;

有人可能会嘲笑我的性能,但它确实为您提供了您正在寻找的结果(仅第一行和第三行)。

希望对您有所帮助 ;)