Как SQL в отношениях многих ко многим - PullRequest
1 голос
/ 06 ноября 2011

Я хочу показать, сколько хобби у Джона. Не могли бы вы сказать мне, как написать оператор SQL?

ЧЕЛОВЕК стол

ID | NAME
1 | John

HOBBY стол

ID | NAME
1 | music
2 | sport

PERSON_HOBBY_COMBINATION таблица

ID | PERSON_ID | HOBBY_ID
1 | 1 | 1

ожидаемый результат

HOBBY_NAME | HOBBY_EXIST
music | YES
sport | NO

Ответы [ 3 ]

3 голосов
/ 06 ноября 2011

Это может работать для вас:

SELECT h.name,  
CASE WHEN ph.id IS NULL THEN 'No' ELSE 'Yes' END AS hobby_exist
FROM hobby h 
CROSS JOIN person p 
LEFT JOIN person_hobby_conbination ph ON (ph.p_id = p.id AND ph.h_id = h.id) 
WHERE (p.name = 'John')
1 голос
/ 06 ноября 2011
Select NAME, count(*) AS NoHobbies from Person p
inner join PERSON_HOBBY_COMBINATION phc
on p.ID = phc.PERSON_ID
group by p.ID, p.NAME

Обратите внимание, что вы должны сгруппировать по ИД и ИМЯ человека.
Вам необходимо сгруппировать по ИМЯ, потому что у вас есть это в выводе, но если у вас есть дубликаты имен, группировка по ИМЯ будет суммировать несколько человекхобби вместе, поэтому вам нужно сгруппироваться и по идентификатору.

Редактировать
Когда вы проверяете ожидаемый результат, вы не хотите, сколько хобби у Джона, но какие хобби.Тогда вам нужно написать

Select p.NAME as PersonName, h.Name as HobbyName, case when phc.ID is null then 'No' else 'Yes' end as HasHobby from Person p
inner join Hobby h
on 1 = 1
left outer join dbo.PersonHobbyCombination phc
on p.ID = phc.PersonID and h.ID = phc.HobbyID
0 голосов
/ 06 ноября 2011

Если у вас уже есть идентификатор Джона и вы хотите просто подсчитать, то это должно сработать.

select count(*) from person_hobby_combination where person_id=?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...