2014-09-16 3 views
0

사람이 포함 된 MySQL 테이블이 있습니다. 그 사람들에게는 하나 이상의 사람 유형이 지정됩니다. 사람들 유형은 다른 MySQL 테이블에 저장되어 있으며 조인을 사용하여 데이터를 연결합니다.MySQL 특정 값을 포함해야하는 테이블 결합

내가 원하는 것은 특정 유형의 사람들을 선택하는 것입니다.

다음 예에서는 사람 유형이 1234이고 4321 인 사람을 선택하고 싶습니다. 그들은 다른 사람들 유형에도있을 수 있지만 적어도 내가 지정한 두 가지에 있어야합니다.

내 쿼리를 시도했지만 아무 것도 반환하지 않습니다.

SELECT p.person_id 
    FROM people AS p 
    INNER JOIN people_types AS pt ON pt.person_id = p.person_id AND pt.type_id IN ('1234') AND pt.type_id IN ('4321') 

이렇게 할 수있는 특정 기능이 있습니까? 봤는데


EDIT 두 번 테이블에 가입하는 것이 좋습니다. 그러나 이것은 비효율적 인 것처럼 보인다. 대신 LEFT JOIN을 사용하면 유연성이 향상됩니까?

SELECT p.person_id 
    FROM people AS p 
    LEFT JOIN people_types AS pt ON pt.person_id = p.person_id 
    WHERE pt.type_id IN ('1234') AND pt.type_id IN ('4321' 
+0

난 당신이 두 번 같은 테이블에 가입해야합니다 생각합니다. – AK47

+0

좌측 조인을 사용하고 몇개의 해답에서 제안 된 IN 절과 같은 조건에서 ID를 유지합니다. 조건은 항상 거짓입니다. 하나의 행은 하나의 유형에만 속할 것입니다. AND in 어디에서 두 값에 대해 한 행의 type_id 열을 검사합니다.이 값은 항상 false입니다. – AK47

답변

1

사용자가 지정한 두 가지 유형 모두를 원하면 PersonTypes를 두 번 조인해야합니다. 내가

SELECT p.person_id 
    FROM people AS p 
    INNER JOIN people_types AS pt ON pt.person_id = p.person_id AND pt.type_id IN ('1234') 
    INNER JOIN people_types AS pt1 ON pt1.person_id = p.person_id AND pt1.type_id IN ('4321') 

가입 방지하기 위해이 작업을해야한다고 생각

select PersonID,count(id) from PersonType 
where TypeID in(1,2) 
group by PersonID 
having count(id) >= 2 

참조 데모 here

+0

감사합니다. @ AK47. 두 번째 테이블 조인을하지 않아도 가능한지 알고 싶습니다. 비효율적 인 것 같습니다. –

+0

확실히 시도하겠습니다. PeopleType의 값에서 희망하는 값은 UNIQUE는 한 사람과 한 유형 만 한 번만 표가되고 테이블에는 중복 행이 없음을 의미합니다. 권리? – AK47

+0

맞습니다. 당신의 도움을 주셔서 감사합니다! –