1

user_to_room テーブルがあります

roomID | userID 

このクエリを使用して roomID を取得しました (n 個のユーザー ID に応じて)

SELECT   roomID
FROM     user_to_room
WHERE    userID IN (2,5)
GROUP BY roomID
HAVING   COUNT(DISTINCT userID)=2

動作しないデモ: http://www.sqlfiddle.com/#!3/00b4a/1/0

( https://stackoverflow.com/a/16511691/1405318から取得)

ただし、このクエリは、これら 2 人のユーザーがいる部屋と別のランダムなユーザーも返します。指定されたユーザー (2,3) がいる部屋のみを返すクエリが必要です。

実用的な解決策は

SELECT DISTINCT roomID
FROM   user_to_room AS x2
WHERE  x2.roomID NOT IN(SELECT DISTINCT roomID 
                     FROM   user_to_room
                     WHERE  roomID IN(SELECT DISTINCT roomID
                                      FROM   user_to_room
                                      WHERE  userID IN ( 5, 2 )
                                      GROUP  BY roomID
                                      HAVING Count(DISTINCT userID) = 2)
                            AND userID NOT IN( 2, 5 ))
AND roomID IN(SELECT DISTINCT roomID
                                      FROM   user_to_room
                                      WHERE  userID IN ( 5, 2 )
                                      GROUP  BY roomID
                                      HAVING Count(DISTINCT userID) = 2)

実際のデモ: http://www.sqlfiddle.com/#!3/00b4a/2/0

しかし、これはやり過ぎだと思います。何か案は?

4

2 に答える 2

1

最初のクエリと同じクエリを使用できるはずですが、フィルターを追加して、2、5 以外のユーザーがいる部屋を除外します。

select roomId
from user_to_room
where userid in (2,5)
  and roomid not in (select roomid
                     from user_to_room
                     where userid not in (2, 5))
group by roomId
having count(distinct userid) = 2;

デモで SQL Fiddle を参照してください

于 2013-05-29T22:33:39.387 に答える
1
SELECT r1.roomID
FROM user_to_room r1
INNER JOIN user_to_room r2 ON r1.roomID=r2.roomID
LEFT OUTER JOIN user_to_room r3 ON r1.roomID=r3.roomID AND r3.userID NOT IN (2,5)
WHERE r1.userID=2 AND r2.userID=5
  AND r3.roomID IS NULL
于 2013-05-29T22:44:43.437 に答える