如何在多对多关系中进行SQL

时间:2011-11-06 07:27:45

标签: sql many-to-many

我想表明约翰有多少爱好。你能告诉我如何编写SQL语句吗?

PERSON表

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 个答案:

答案 0 :(得分:3)

这可能对您有用:

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 :(得分:1)

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

请注意,您应该对该人的ID和NAME进行分组 你需要在NAME上进行分组,因为你在输出中有它,但是如果你有重复的名字,NAME上的分组会将几个人的爱好相加,这就是你需要对ID进行分组的原因。

修改
在检查您的预期结果时,您不希望约翰有多少爱好,但有哪些爱好。然后你需要写

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

答案 2 :(得分:0)

如果您已经拥有John的ID并且只想要一个原始计数,那么这应该可行。

select count(*) from person_hobby_combination where person_id=?