2012-12-16 57 views
2

这是我的谈话表:SQL消息表查询

conversationID || userID 
     1   || 1 
     1   || 2 
     2   || 1 
     2   || 2 
     2   || 3 

,你可以看到每个会话可以包含2个或更多用户。

我想获得只有2个用户在那里的对话的id。 即只包含用户的会话1 & 2,答案是会话1.

但我该如何得到它?

回答

2

这将选择具有用户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 
+0

+1我喜欢这种方式,我不认为我以前见过它。它可以很好地扩展到一个分析函数,该函数也返回完整的行集合。 –

+0

进一步思考:我认为一个潜在的改进是在团队之前消除对话,特别是如果有很多对话1和2没有涉及。因此,如果沿着“where conversationid in(从userid = 1的对话中选择conversationid”)这一行添加了一个子句(希望以某种方式使用不那么健谈的用户),那么它可能是扩展查询的重要帮助。 –

+0

@DavidAldridge谢谢!我更新了我的答案,即使集合中的一个元素不存在,第一个查询也会返回对话,并且我不确定这是OP想要的内容...第二个(和第三个)查询应该正确处理这个问题 – fthiella

2

你应该使用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 
+0

我不知道,但我认为OP希望对话,只有** **特定用户是否有 –

+0

@ABCade,固定!谢谢!! – danihp

2

希望这可以帮助你,

select conversationID from conversation 
group by ConversationID having count(distinct UserID)=2; 

sqlfiddle demo

+0

啊,这将是只有两个用户参与的谈话,而不是两个特定用户 –

+0

耶正确的大卫。那么我的例子会工作吗? – Mari