2011-01-04 4 views
2

이 질문 또는 정의 방법은 모르지만 알아낼 수는 없습니다.MySQL : 하나만 있지만 다른 다 대다 관계가없는 행을 나열하십시오.

persons    person_id, first_name, last_name 
hobbies    hobby_id, name 
persons_hobbies  person_id, hobby_id 

나는이 목록을 만들 필요가 :

는이 같은 세 개의 테이블이있다. 취미 A와 B가 모두있는 사람과 취미 A가 있지만 B가 아닌 사람이이 두 가지 쿼리를 작성하려면 어떻게해야합니까? 가입과 모든 방법으로이 작업을 수행하는 방법을 알아낼 수 없습니다.

취미 A는 id = 3이고 취미 B는 id = 7입니다. 이 같은

답변

6

뭔가 작업을해야합니다 :

-- Persons that have both hobby A and B 
select p.first_name,p.last_name 
from persons p 
inner join persons_hobbies ph1 on ph1.person_id = p.person_id and ph1.hobby_id = 3 
inner join persons_hobbies ph2 on ph2.person_id = p.person_id and ph2.hobby_id = 7; 

-- Persons that have hobby A but not B 
select p.first_name,p.last_name 
from persons p 
inner join persons_hobbies ph1 on ph1.person_id = p.person_id and ph1.hobby_id = 3 
left outer join persons_hobbies ph2 on ph2.person_id = p.person_id and ph2.hobby_id = 7 
where ph2.person_id is null; 
+0

나는 이드에게 미안하다. 지금 질문에 예제 ID 추가 : – Svish

+0

멋지다. ID를 사용하여 답변을 업데이트 할 예정입니다. –

+0

고마워! 잘 작동하는 것 같습니다. 너는 내 목숨을 구했다. – Svish

0

난 당신이 하위 쿼리를 사용하는 경우 이해하고 코드를 쉽게가이 유형을 찾을 수 있습니다.

SELECT * FROM Persons 
WHERE person_id IN (SELECT person_id FROM person_hobbies WHERE hobby_id ...) 

하지만 가입해야한다면 - 아이크가 그것을 못 박았습니다.

+0

이 테이블의 크기를 알지 못하기 때문에 상당히 큰 것으로 가정하는 것이 가장 안전하다고 생각합니다.이 경우 OP는 하위 쿼리보다 조인을 사용하여 훨씬 더 우수한 성능을 얻을 수 있습니다. –