2

次のフィールドを持つ参加者というテーブルがあります。

  • 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に設定すると機能するようですが、このコンテキストで何が行われるかはわかりません。

クエリは正しいですか?もしそうなら、なぜですか?そうでない場合、それを機能させるために何を変更する必要がありますか?

4

2 に答える 2

8

where句はuser_idsを除外するため、クエリの使用は機能しません。使用する

SELECT * FROM participants
GROUP BY conversation_id
HAVING sum(user_id not in (1,2)) = 0

user_id not in (1,2)以外が会話中などの1場合に戻ります。したがって、を使用すると、そのすべてのケースを合計できます。何も見つからない場合、合計はです。user_id1,20SUM0

于 2012-12-09T14:46:19.960 に答える
0
select conversation_id
from participants
where user_id in (1,2)
group by conversation_id
having count(user_id) = 2

2 人のユーザーの conversation_id を返します

于 2021-01-03T20:52:54.143 に答える