2012-11-08 3 views
2

이 쿼리를 작성하는 데 도움을 주시면 감사하겠습니다. 나는 운없이 여러 방법을 시도했다. 내 질문은 다소 구사하기가 어렵 기 때문에 나는 내가하고 싶은 일에 대한 간단한 예를 만들 것이다. 나는 두 가지 특정 색으로 ID가있는 경우 유형을 반환하는 쿼리를 생성 할다중 조건이 하나의 열을 충족시키는 ID를 찾기위한 MySQL 쿼리

ID TYPE COLOR 
1 A  Blue 
1 B  Red 
1 C  Green 
2 C  Blue 
2 B  Green 

: 나는 구조적 다음과 유사한 데이터를 가지고있다. 예를 들어 파란색과 빨간색을 모두 가진 모든 ID를 찾고 싶습니다. 그러면 쿼리가 반환됩니다.

1, A , B 

A와 B가 반환되는 순서는 중요하지 않습니다. 데이터 세트가 크면 많은 ID가 두 조건 (어쩌면 50,000 정도)과 일치 할 것으로 예상됩니다. 그 유형이 색상과 관련이 없으므로 문제가 this other stackoverflow question, as well as this one과 다른 점에 유의해야합니다.

나는 일종의 하위 쿼리를 수행해야한다고 생각합니다. 하지만 정말로 어떻게 진행해야할지 모르겠다. 고마워.

+0

미래의 질문을해야 할 경우 예제 데이터와 구조를 입력하는 것이 좋습니다. – Laurence

답변

5
SELECT ID, TYPE FROM types NATURAL JOIN (
    SELECT ID FROM types GROUP BY ID HAVING SUM(COLOR='Red') AND SUM(COLOR='Blue') 
) t WHERE COLOR IN ('Red', 'Blue') 

sqlfiddle에서 확인하십시오. 당신이 구분 된 문자열로 결합 유형을 가지고 행복 경우

은 또한, 단일 패스에서 원하는 데이터를 추출 할 수 있습니다

SELECT ID, GROUP_CONCAT(TYPE) 
FROM  types 
WHERE COLOR IN ('Red', 'Blue') 
GROUP BY ID 
HAVING COUNT(*) = 2 

sqlfiddle에를 참조하십시오.

테이블에 동일한 (ID, COLOR) 쌍이 포함 된 여러 레코드가 포함되어있는 경우 COUNT(*)을 더 비싼 COUNT(DISTINCT COLOR)으로 바꿔야합니다.

+0

MySQL에서는 부울 식 ('color = 'Red'')에 대해 합계를 계산할 수 있습니까? 어떻게 정의됩니까? 내 말은, 거짓과 거짓의 값을 합한 결과는 무엇일까요? –

+0

@a_horse_with_no_name : 부울 식은 참이면 1, 거짓이면 0, 그렇지 않으면 0입니다. 따라서 합계를 취하는 것은 그룹 구성원이 일치하지 않으면 0이되고 적어도 하나의 구성원이 일치하면 0이됩니다. HAVING 절의 결과를 사용하여 다시 부울로 캐스트합니다. 귀하의 예제에서 결과는 '0 + 0 + 0 + 1 + 1 = 2'입니다. – eggyal

+0

그래서 MySQL에는 "실제"불리언 값이 없습니다. (왜냐하면'0'과'1'은 ** 부울이 아닌 **). –