当条件相同时,自联接表如何决定显示什么?"

时间:2014-05-10 07:36:21

标签: postgresql join self-join

我有一个简单的聊天表。聊天表包含user_id列和recipient_id列以及布尔agrees_to_chat列。

我想做的是显示用户1想要与之聊天的用户以及所有其他用户还希望与用户1聊天的用户。

(请注意,有些情况下1会同意与2聊天,但有2人尚未上网发出偏好信号。很明显,在这些情况下,我不希望聊天出现。)

这是我到目前为止所提出的。

SELECT c1.user_id, c1.recipient_id, c2.user_id, c2.recipient_id FROM chats c1, chats c2 
      WHERE c1.recipient_id = c2.user_id 
        AND c1.user_id = c2.recipient_id 
        AND c2.user_id=1 
        AND c2.agrees_to_chat=true 
        AND c1.agrees_to_chat=true

由于某些原因设置c2.user_id = 1会产生我想要的结果:user_id = 1的记录,以及同意在chat_id列中列出的聊天的人。

但是,如果我将其设置为c1.user_id=1,我会将相同的结果翻转过来。也就是说,现在我的结果仍然是同意聊天的人,但现在所有结果的recipient_id = 1,而user_id是不同的用户。

这对我很重要,因为如果我想提供显示同意与用户1聊天的所有人的数据,但如果我决定在我的代码中引用recipient_id,我需要知道赢了改变...例如,在我的计算机上,我注意到c2.user_id =1会产生我想要的东西,但是在这个sql中,似乎c1.user_id=1得到了我需要的东西...... {{3} }

那么这里发生了什么?有什么我不理解我的查询吗?或者,我可以更好地查询我想要实现的目标吗?

1 个答案:

答案 0 :(得分:1)

您不需要所有4列,因为您已经知道第1和第4(以及第2和第3)将是相等的。使用SELECT c2.user_id, c2.recipient_id FROM ...SELECT c1.user_id, c1.recipient_id FROM ...。如果您确实需要自联接表中同一列的多个副本,您可以为它们指定名称:SELECT c1.user_id AS user_id1, c1.recipient_id AS recipient_id1, c2.user_id AS user_id2, c2.recipient_id AS recipient_id2 FROM ...