2017-04-15 10 views
0

私は必要なものは複雑ですが、やはりSQLでうまくいきません。基本的に私は会話の参加者を格納するテーブルを持っています。 2つの提供されたユーザーIDを使用して、2人の特定のユーザーのみを含む会話が存在するかどうかを判断する照会が必要です。この2つを超える追加のユーザーを含む会話はカウントしないでください。つまり、2人のユーザー間で1対1の会話のみです。ここでSQL:2つの指定された値に基づいて一致するIDを持つ2つの行を正確に選択してください

は私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一部を理解してるとは思いません、このクエリは、他のユーザーがその会話内に存在する場合でも、2人のユーザーを含むすべての会話を返すためです。ここでも、2人の提供されたユーザーの間で1対1の会話だけが選択されなければなりません。それ以外の場合は、何も選択しないでください。たとえば、上記のSQLfiddleでは、conversation_id12または19の行のみが返されます。他のすべての一致には2つ以上の行が含まれるためです。

これは私が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

申し訳ありませんが、私はあなたの編集を見た前に、私はコメントしています。これは完璧ですが、すばやく対応してくれてありがとう! –

関連する問題