這是我的談話表: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