2014-06-24 3 views
0

대화의 사용자가 (2, 5)와 같이 배열에 제공된 사용자와 정확히 일치하는 MySQL 테이블에서 conversation_id를 선택해야합니다. 대화 ID. DB를 테이블의여러 행에서 데이터를 가져 오기위한 MySQL 쿼리

추출은 다음과 같이

user_ids (2, 5) 

conversation_users: 

conversation_id  user_id 
1     2 
1     5 
2     2 
2     6 

이 단일 쿼리에서 수행 할 수 있습니까?

편집 - 2014년 6월 26일

사실, 몇 가지 테스트를 수행 한 후이 항상 제대로 작동하지 않습니다. 대화에 속한 사용자가 배열에있는 사용자보다 많으면 해당 사용자가 속한 모든 대화를 계속 반환합니다.

배열의 사용자와 대화중인 사용자의 정확한 일치를 얻고 싶습니다. 아래 예에서

fiddle

, 대화 (6, 7) 모두가 반환하지만 모든 행 반환하지 않아야

SELECT `conversation_id` FROM `conversation_user` WHERE `user_id` IN (70, 426) 
GROUP BY `conversation_id` HAVING COUNT(DISTINCT `user_id`) = 2; 


conversation_user_id conversation_id user_id 
14     6    70 
15     6    29 
16     6    442 
17     6    425 
18     6    426 
19     7    70 
20     7    442 
21     7    426 
22     7    499 
23     7    425 
24     7    29 
+1

비슷한 대답은 = 2 COUNT (DISTINCT USER_ID)을 갖는'에서 "2"의 가치인가 '배열에있는 사용자의 수? –

답변

2

있음이 WHERE, GROUP BY의 조합을 이용하여 가능하다, 그리고 이 같은 HAVING 조항 :

SELECT conversation_id 
FROM conversation_users 
WHERE user_id IN (2,5) 
GROUP BY conversation_id 
HAVING COUNT(DISTINCT user_id) = 2 

2 옵션 :

하나의 대화에 두 개 이상의 레코드 (사용자)가있는 경우 몇 가지 대안이 있습니다. 하나의 옵션은 다음과 같이 WHERE 절은 제거되고 GROUP_CONCAT가 사용되는, 아래 : 그것은 사용자 목록이 정렬 된 쉼표로 구분 될 것으로 예상하기 때문에

SELECT `conversation_id` FROM `conversation_user` 
GROUP BY `conversation_id` 
HAVING COUNT(DISTINCT `user_id`) = 2 
AND GROUP_CONCAT(DISTINCT `user_id` ORDER BY `user_id` ASC SEPARATOR ',') = '70,426' 

그러나, 이것은 매우 유연한 접근하지 않을 수 있습니다 끈.

작업 바이올린 : http://sqlfiddle.com/#!2/4c82d/13

3 옵션 :

대신 (위의 2 옵션 등) GROUP_CONCAT 만 2 사용자가 만 대화를 얻을 수있는 하위 쿼리를 사용합니다. 그런 다음 기본 테이블이 하위 쿼리에 가입하고 다음과 같이 위의 첫번째 옵션에 사용 된 것과 동일한 필터 (WHEREGROUP BY)를 적용 : 그것은에 의존하지 않기 때문에

SELECT `conversation_id` 
FROM `conversation_user` 
JOIN (
    SELECT `conversation_id` t_cid FROM `conversation_user` 
    GROUP BY `conversation_id` 
    HAVING COUNT(DISTINCT `user_id`) = 2 
) t 
ON t.t_cid = `conversation_user`.`conversation_id` 
WHERE `user_id` IN (70, 426) 
GROUP BY `conversation_id` 
HAVING COUNT(DISTINCT `user_id`) = 2 

이 더 나은 방법이 될해야 두 번째 옵션에서 쉼표로 구분 된 정렬 된 목록.

작업 바이올린는 : http://sqlfiddle.com/#!2/4c82d/21

오늘 http://sqlfiddle.com/#!2/d856b/3
+0

에서 –

+1

@AsaCarter 네, 맞습니다. 값 "2"는 배열의 사용자 수입니다. –

+0

위의 수정 된 질문. 대화에 더 많은 사용자가있을 때 대답이 올바르게 작동하지 않습니다. –

관련 문제