次のフィールドを持つ参加者というテーブルがあります。
- id
- ユーザーID
- 会話ID
背景には、少なくとも2人以上の参加者との会話があります。指定された2人のユーザーのみが開催し、他のユーザーが会話に参加していない会話を見つけたい。
私は次のことを思いついた:
SELECT *
FROM participants
WHERE user_id = 1 OR user_id = 2
GROUP BY conversation_id
HAVING COUNT(*) = 1
このコンテンツを考えると
ユーザー1と2がユーザー3と会話を共有している(会話1)だけでなく、1つの会話だけを持っている(会話2)ことがわかります。
上記のクエリは実際には正しいconversation_id(つまり2)を返しますが、クエリが正しいかどうかはわかりません。私がそれが会話1を返すと言うときHAVING COUNT(*) = 2
、そして私は理由がわかりません。直感的にはカウントを使用していましたが、1に設定すると機能するようですが、このコンテキストで何が行われるかはわかりません。
クエリは正しいですか?もしそうなら、なぜですか?そうでない場合、それを機能させるために何を変更する必要がありますか?