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;
有人可能会嘲笑我的性能,但它确实为您提供了您正在寻找的结果(仅第一行和第三行)。
希望对您有所帮助 ;)
使用 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;
有人可能会嘲笑我的性能,但它确实为您提供了您正在寻找的结果(仅第一行和第三行)。
希望对您有所帮助 ;)