확인

2013-05-29 1 views
1

은 내가확인

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

하는 데모를 작동하지 않음 (N 사용자 아이디에 따라 다름) roomID를 얻기 위해이 쿼리를 사용

roomID | userID 

user_to_room 테이블이 : http://www.sqlfiddle.com/#!3/00b4a/1/0

(https://stackoverflow.com/a/16511691/1405318에서 가져옴)

그러나이 쿼리는 이 두 사용자가 다른 무작위 사용자와 함께있는 방. . 나는 작업 솔루션이

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) 

근무 데모 것

만 주어진 사용자 (2,3)에있는 방을 반환하는 쿼리가 필요합니다 http://www.sqlfiddle.com/#!3/00b4a/2/0

그러나 나는이 생각 너무 길다. 어떤 아이디어?

+0

를 참조하십시오 SELECT roomID FROM user_to_room u1 JOIN user_to_room u2 USING (roomID) u1.userID = 2 AND u2.userID = 3' –

+0

작동하지 않음 : 'Using'근처의 구문이 잘못되었습니다. : SELECT roomID FROM user_to_room u1 JOIN user_to_room u2 (roomID) WHERE 사용 u1.userID = 2 AND u2.userID = 5 – Chris

+0

대신에 '켜기'사용 –

답변

1

당신은이 외부의 사용자가 방, 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 with Demo

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