2012-12-16 87 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