我有一个名为参与者的表,其中包含以下字段:
背景是至少有两个或更多参与者进行对话。我想找到一个仅由两个指定用户持有的对话,而对话中没有其他用户。
我想出了以下内容:
SELECT *
FROM participants
WHERE user_id = 1 OR user_id = 2
GROUP BY conversation_id
HAVING COUNT(*) = 1
鉴于此内容
participant table image http://s12.postimage.org/af4xrfoax/table.png
您可以看到用户1和2与用户3(对话1)共享对话,但也只有一个对话(对话2)。
上面的查询实际上返回了正确的conversation_id(即2) - 但我不确定查询是否正确。当我说HAVING COUNT(*) = 2
它返回会话1时,我不知道为什么。直觉上我使用了计数 - 如果设置为1似乎有效 - 但我不确定它在这种情况下的作用。
查询是否正确?如果是这样,为什么?如果没有,我需要更改什么才能使其正常工作?
答案 0 :(得分:7)
使用您的查询将无效,因为where
子句会过滤掉user_ids。使用
SELECT * FROM participants
GROUP BY conversation_id
HAVING sum(user_id not in (1,2)) = 0
如果user_id not in (1,2)
不是1
在对话中,则{p> user_id
会返回1,2
,否则会0
。因此,使用SUM
可以添加所有这些案例。如果没有找到,则总和为0
。
答案 1 :(得分:0)
select conversation_id
from participants
where user_id in (1,2)
group by conversation_id
having count(user_id) = 2
返回两个用户conversation_id