MySQL: список строк, которые имеют одно, но не другое отношение «многие ко многим» - PullRequest
2 голосов
/ 04 января 2011

Не совсем уверен, как спросить или определить это, но не могу понять.

У меня есть три таблицы, подобные этой:

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

Мне нужно составить два списка.Лица, у которых есть хобби A и B, и люди, у которых есть хобби A, но не B. Как я могу написать эти два запроса?Не могу понять, как сделать это с присоединением и всем ...

Скажите, что хобби А имеет идентификатор = 3, а хобби Б - идентификатор = 7.

Ответы [ 2 ]

6 голосов
/ 05 января 2011

Примерно так должно работать:

-- 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 голосов
/ 05 января 2011

Я считаю, что этот тип легче понять и кодировать, если вы используете подзапросы.

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

Но если вы должны присоединиться - Айк прибил его.

...