我有一个简单的聊天表。聊天表包含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} }
那么这里发生了什么?有什么我不理解我的查询吗?或者,我可以更好地查询我想要实现的目标吗?
答案 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 ...