2017-12-30 2 views
0

나는 내 DB에 다음과 같은 테이블이 : 나는 personID 5와 6 만하고 다른 personID 모두 포함 된 각 groupID을 반환하는 쿼리를 파악하기 위해 노력하고있어특정 ID 만 있고 다른 ID는없는 레코드가 공통 열을 쿼리합니까?

people_to_groups 

id | personID | groupID 
------------------------- 
1 | 5  | 2 
------------------------- 
2 | 6  | 2 
------------------------- 
3 | 7  | 3 
------------------------- 
4 | 5  | 3 
------------------------- 
5 | 5  | 4 
------------------------- 
6 | 5  | 7 
------------------------- 
7 | 6  | 7 

. 쿼리가 위의 표에서 실행하는 경우

그래서, 다음과 같은 결과 집합을 반환 :

그룹 2와 7이 두 사람 5, 6, 다른 사람이 가지고있는 유일한 그룹이
groupID 
------- 
2 
------- 
7 

때문입니다.

(PS 사람이 편집을 제안 바랍니다 더 나은 제목을 생각할 수있는 경우)

+0

데이터 세트가 매우 대표적이 아님 – Strawberry

답변

1

answer by Vashi 멋진이지만, 선택 그룹 (예 : 5 & 6 또는 5연속 경우에만 사용할 수 있습니다 - 최소 5
가6 & 7이 아니라 5 & 8). 모든 경우를 커버하기 위해, 당신은 요구 사항의 직접적인 번역을 사용할 수 있습니다

SELECT DISTINCT groupID 
FROM people_to_groups 
WHERE personID = 5 
    AND groupID IN (SELECT groupID 
        FROM people_to_groups 
        WHERE personID = 6) 
    AND groupID NOT IN (SELECT groupID 
         FROM people_to_groups 
         WHERE personID NOT IN (6 , 5)); 

이 이해 5에 대한 모든 그룹을 선택, 6 그룹을 추가, 그리고 마지막으로 다른 숫자에 대 한 모든 그룹을 제거하기 쉽습니다.

SELECT groupID 
FROM people_to_groups 
WHERE personID IN (6 , 5) 
    AND groupID NOT IN (SELECT groupID 
         FROM people_to_groups 
         WHERE personID NOT IN (6 , 5)) 
GROUP BY groupID 
HAVING COUNT(DISTINCT personID) = 2; 

그래서 여기에 같은 생각, 우리가 그룹을 찾고있는 단지가 2 개 별개 번호 : 당신이 Vashi의 대답에 그룹화 아이디어를 좋아하는 경우에

또는, 당신은 모든 경우를 충당하기 위해 수정할 수 있습니다 이 두 숫자를 5 & 6으로 정의합니다. 유일한 차이점은 5 & 6을 범위 (즉, min = 5 및 max = 6)로 정의하는 대신 실제로 검색을 5 & 6으로 제한 한 다음 제거합니다 다른 모든 숫자.

두 가지 해결 방법 중 어느 것을 사용할지는 상황에 따라 다릅니다. 첫 번째 것은 간단하고 이해하기 쉽지만 선택 그룹에 여러 개의 숫자가있는 경우 (예 : 5 10) 많은 하위 쿼리가 생성됩니다. 이 경우 두 번째 솔루션은 동일하게 유지 될 것이므로 더 쉽게 관리 할 수 ​​있으며 IN()NOT IN() 부분에 원하는 모든 숫자를 추가하기 만하면됩니다.

+0

두 번째 솔루션의 경우 마지막 줄을 변경해야합니다. = 2; 선택 그룹의 personID 수만큼? – saricden

3

당신은이 세 가지 규칙을 사용할 수 있으며, 그룹 ID는 모두 5와 6이 있는지 확인하려면
1 - 최대 6 인을
2 - 고유 personid의 카운트가 2

SELECT groupID 
FROM people_to_groups 
GROUP BY groupID 
HAVING MAX(personID) = 6 
    AND MIN(personID) = 5 
    AND COUNT(DISTINCT personID) = 2; 
+0

완전성을 위해 '= 최대 (6,5)'가 더 명확하게 확장 가능합니다. – Strawberry

관련 문제