将一个表与自身连接起来


Left join one table with itself

SELECT s1.receiverID, s2.senderID
FROM messages as s1
LEFT JOIN messages as s2 ON s1.receiverID = s2.senderID

我想组合发送者 ID 和接收者 ID 相同的"消息"表以实现类似对话流的东西,但是当我运行它时,它总共返回 10,422 行。当所有行都是 3000 时,它如何返回更多?!

示例场景:ID = 8 的用户转到此 URL sample.com/inbox/user=275。我想显示它们之间的所有消息,以实现诸如对话流/聊天之类的内容。

你不想加入。 您只想获取同时具有发送方和接收方的所有消息。

select * -- (or whatever)
from messages
where
(senderid = [userId] and receiverid = [otherUserId])
or (senderid = [otherUserId] and receiverid = [userId])

您写的加入是说"给我系统中消息的每个组合,其中一条消息的发送者与另一条消息的接收者相同,如果有人收到消息但未发送任何消息,也向我显示发送方值的空值。

也许这就是您真正想要的?

select t1.senderID as t1senderID, t1.receiverID as t1receiverID,
  t2.senderID as t2senderID, t2.receiverID as t2receiverID
from messages t1
join messages t2
on t1.senderID = t2.receiverID and t1.receiverID = t2.senderID

样品日期会有很大帮助。

编辑:

鉴于此评论:

我们有用户 A 和用户 B,我想返回它们之间的所有消息

您正在寻找以下内容:

select * from t1
where (senderID = 'A' and receiverID = 'B') or
      (senderID = 'B' and receiverID = 'A')

此示例可以帮助您弄清楚为什么在联接后获得更多行。

rID sID
1   2
1   3
2   1
3   1
s1.rID s1.sID s2.rID s2.sID
1      2      2      1
1      2      3      1
1      3      2      1
1      3      3      1
2      1      1      2
3      1      1      3