2

我有一个名为参与者的表,其中包含以下字段:

  • ID
  • 用户身份
  • 对话ID

背景是至少有两个或更多参与者的对话。我想查找仅由两个指定用户进行的对话,对话中没有其他用户。

我想出了以下几点:

SELECT * 
FROM participants
WHERE user_id = 1 OR user_id = 2
GROUP BY conversation_id
HAVING COUNT(*) = 1

鉴于此内容

参与者表图像

您可以看到用户 1 和 2 与用户 3 共享一个对话(对话 1),但也有一个单独的对话(对话 2)。

上面的查询实际上返回了正确的conversation_id(即2)-但我不确定查询是否正确。当我说它HAVING COUNT(*) = 2返回对话 1 时,我不知道为什么。直觉上,我使用了 count - 如果设置为 1,它似乎可以工作 - 但我不确定它在这种情况下会做什么。

查询是否正确?如果是这样,为什么?如果没有,我需要更改什么才能使其正常工作?

4

2 回答 2

8

使用您的查询将不起作用,因为该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如果user_id不是1,2在对话中,则返回,0否则返回。所以使用SUM你可以加起来所有的情况。如果没有找到,则总和为0

于 2012-12-09T14:46:19.960 回答
0
select conversation_id
from participants
where user_id in (1,2)
group by conversation_id
having count(user_id) = 2

返回两个用户的conversation_id

于 2021-01-03T20:52:54.143 回答