2011-12-30 3 views
2

정확한 수신자 집합 만 가진 모든 대화를 찾으려고합니다. 내 표는 다음과 같다 : 나는 conversation_id 하나를 얻으려면 위의 내가 알고있는 유일한 일을 사용여러 행에 걸쳐 값 집합과 일치하는 특정 레코드를 가져옵니다.

Conversation 
--------------- 
id | some other fields 

User 
--------------- 
id | some other fields 

Recipients 
-------------- 
id | conversation_id | user_id | some other fields 
1 | 1    | 1 
2 | 1    | 2   
3 | 2    | 1 
4 | 2    | 2     
5 | 2    | 3 
6 | 3    | 1 
7 | 3    | 3 

이 USER_ID의 [1,2]입니다하지만 난 가겠어요 어떻게 다른 기록 중 하나를 돼요 이렇게.

답변

2

conversation_id으로 그룹화 한 다음 having을 사용하여 올바른 대화를 걸러 낼 수 있습니다. 아래 쿼리에서 첫 번째 줄에는 user_id 1과 2가 모두 필요합니다. 두 번째 줄은 포함하지 않는 것을 요구 어떤 user_id 기타 :

select conversation_id 
from recipients 
group by 
     conversation_id 
having count(distinct case when user_id in (1,2) then user_id end) = 2 
     and count(case when user_id not in (1,2) then 1 end) = 0 
+0

완벽하게 작동합니다. 고맙습니다!! – dennis1600

+0

방금 ​​알아 챘습니다. '대화'가 아닌 '수령인'이 아니겠습니까? –

+0

을 알고 있어야합니다. 1) 목록 2) 목록 번호 – MRM

0

는 I 올바르게 이해 경우 < USER-IDS>은 쉼표로 구분 된 사용자 ID와 < NUMBER-OF-USERS이다

SELECT id 
, conversation_id 
, user_id 
, ... other columsn 
FROM Recipients 
WHERE converstaion_id = 1 
AND user_id IN (1,2) 
+0

conversation_id는 알지 못하지만 결과에서 기대하는 conversation_id는 1입니다. – dennis1600

0
select c.* from Conversation c 
    where (select count(distinct user_id) from Recipients 
    where conversation_id=c.id and user_id in (<USER-IDS>))=<NUMBER-OF-USERS> 

가> 해당 사용자의 정확한 수, 예를 들어 인 귀하의 예에서 2.

+0

이것은 사용자 1,2,3 사이의 대화와 일치합니다. 'where' 절은 Mr. 3을 필터링하고 하위 쿼리는 2를 반환합니다 – Andomar

+0

이것은 대화 1과 2를 되 돌리는 것입니다. – dennis1600

0

먼저 느릅 나무 conversation_id 유무 USER_ID (내부 서브 쿼리) 다음이 목록

SELECT DISTINCT conversation_id 
FROM   dbo.Recipients 
WHERE  (conversation_id NOT IN 
          (SELECT  Recipients_1.conversation_id 
          FROM   dbo.Recipients AS Recipients_1 LEFT OUTER JOIN 
                 (SELECT id AS user_id 
                 FROM   User 
                 WHERE  (id IN (1, 2))) AS tbl_user ON tbl_user.user_id = Recipients_1.user_id 
          WHERE  (tbl_user.user_id IS NULL))) 
에없는 conversation_id를 찾을 수 귀하의 목록에없는 것을 발견
+0

이것은 다른 사람들 사이의 대화를 제외하지만 Mr. 1과 Mr. 2가 모두 참석할 것을 요구하지는 않습니다. Btw,'user_id'에'user'에 참여할 필요가 없습니다. – Andomar

관련 문제