这是我的谈话表:SQL消息表查询
conversationID || userID
1 || 1
1 || 2
2 || 1
2 || 2
2 || 3
,你可以看到每个会话可以包含2个或更多用户。
我想获得只有2个用户在那里的对话的id。 即只包含用户的会话1 & 2,答案是会话1.
但我该如何得到它?
这是我的谈话表:SQL消息表查询
conversationID || userID
1 || 1
1 || 2
2 || 1
2 || 2
2 || 3
,你可以看到每个会话可以包含2个或更多用户。
我想获得只有2个用户在那里的对话的id。 即只包含用户的会话1 & 2,答案是会话1.
但我该如何得到它?
这将选择具有用户1或用户2,或两者的所有对话,但没有其他人:
select conversationID
from conversations
group by conversationID
having count(*) = count(case when userID in (1,2) then 1 end)
如果你也想,它们拥有完全用户1和2的所有对话,并没有其他人,你还必须添加和条件:
select conversationID
from conversations
group by conversationID
having count(*) = count(case when userID in (1,2) then 1 end)
and count(*) = 2 -- number of elements in set
如果用户ID可以被复制,这也是更好地使用不同的:
select conversationID
from conversations
group by conversationID
having
count(distinct userID) = count(distinct case when userID in (1,2) then userID end)
and count(distinct userID) = 2 -- number of elements in set
你应该使用having子句。假设(的conversationId,用户ID)是PK还是AK,您查询的是:
select conversationID
from your_Table
group by conversationID
having count(*) = 2
编辑与1,2-用户加入对话,这是不包括指数友好的方式按行相关子查询和无功能。
select t1 conversationID
from your_Table t1
inner join
(select distinct conversationID
from your_Table
where userId in (1, 2)
) t2
on t1.conversationID = t2.conversationID
group by t1.conversationID
having count(distinct t1.userId) = 2
我不知道,但我认为OP希望对话,只有** **特定用户是否有 –
@ABCade,固定!谢谢!! – danihp
希望这可以帮助你,
select conversationID from conversation
group by ConversationID having count(distinct UserID)=2;
啊,这将是只有两个用户参与的谈话,而不是两个特定用户 –
耶正确的大卫。那么我的例子会工作吗? – Mari
+1我喜欢这种方式,我不认为我以前见过它。它可以很好地扩展到一个分析函数,该函数也返回完整的行集合。 –
进一步思考:我认为一个潜在的改进是在团队之前消除对话,特别是如果有很多对话1和2没有涉及。因此,如果沿着“where conversationid in(从userid = 1的对话中选择conversationid”)这一行添加了一个子句(希望以某种方式使用不那么健谈的用户),那么它可能是扩展查询的重要帮助。 –
@DavidAldridge谢谢!我更新了我的答案,即使集合中的一个元素不存在,第一个查询也会返回对话,并且我不确定这是OP想要的内容...第二个(和第三个)查询应该正确处理这个问题 – fthiella