2017-04-15 38 views
0

我需要的東西似乎有點複雜,但後來我又不擅長SQL。基本上我有一張存儲對話參與者的表格。我需要一個查詢,它將使用兩個提供的用戶ID來確定是否存在僅包含兩個給定用戶的對話。包含超出這兩個用戶的其他用戶的對話不應被計入 - 兩個給定用戶之間只進行一對一的對話。SQL:根據兩個給定值精確選擇具有匹配ID的兩行

這裏是我的SQLfiddle:http://sqlfiddle.com/#!9/284e1/33/0

而我正在進行的查詢這是不是做的伎倆:

SELECT * FROM mybb_conversation_participants WHERE conversation_id IN ( SELECT conversation_id FROM mybb_conversation_participants WHERE (user_id = 6 OR user_id = 11) GROUP BY conversation_id HAVING COUNT(*) = 2 );

我不認爲我瞭解HAVING COUNT(*) = 2部分,因爲此查詢將返回包含這兩個用戶的所有對話,即使該對話中也存在其他用戶。同樣,應該只選擇兩個提供的用戶之間的1對1對話,否則查詢應該不選擇任何內容。例如,在上面的SQLfiddle中,只有conversation_id1219的行應該返回,因爲所有其他匹配都包含兩行以上的行。

這就是我希望HAVING聲明會做,但顯然不是。

任何想法?

回答

1

您可以group byhaving做到這一點:

SELECT conversation_id 
FROM mybb_conversation_participants 
GROUP BY conversation_id 
HAVING SUM((user_id NOT IN (6, 11)) = 0; 

這是什麼做的?它正在通過對話ID進行彙總。然後,對於每次對話,它計數的用戶是而不是其中之一。它接受對話這是真實的。

如果你喜歡積極,這可能是更容易跟蹤:

HAVING SUM((user_id IN (6, 11)) = COUNT(*) 

這是說,所有的談話的用戶佔與您所選擇的人。

最後,如果你想,以確保這兩個(全部)都參與:

HAVING SUM((user_id IN (6, 11)) = COUNT(*) AND 
     COUNT(DISTINCT user_id) = 2 
+0

對不起,我之前我看到您的編輯評論。這非常完美,非常感謝您的快速響應! –

相關問題