Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在多对多关系中使用SQL_Sql_Many To Many - Fatal编程技术网

如何在多对多关系中使用SQL

如何在多对多关系中使用SQL,sql,many-to-many,Sql,Many To Many,我想展示约翰有多少爱好。您能告诉我如何编写SQL语句吗 人员表 爱好表 个人爱好组合表 预期结果 HOBBY_NAME | HOBBY_EXIST music | YES sport | NO 请注意,您应该根据人员的ID和姓名进行分组。 您需要按姓名分组,因为您在输出中有姓名,但是如果您有重复的姓名,则按姓名分组会将几个人的爱好加在一起,这就是您也需要按ID分组的原因 编辑 当你检查你的预期结果时,你不想知道约翰有多少爱好,而是想知道他有哪些爱好。那你就要写了 Select p.NAME a

我想展示约翰有多少爱好。您能告诉我如何编写SQL语句吗

人员表

爱好表

个人爱好组合表

预期结果

HOBBY_NAME | HOBBY_EXIST
music | YES
sport | NO
请注意,您应该根据人员的ID和姓名进行分组。 您需要按姓名分组,因为您在输出中有姓名,但是如果您有重复的姓名,则按姓名分组会将几个人的爱好加在一起,这就是您也需要按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
请注意,您应该根据人员的ID和姓名进行分组。 您需要按姓名分组,因为您在输出中有姓名,但是如果您有重复的姓名,则按姓名分组会将几个人的爱好加在一起,这就是您也需要按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

这可能适合您:

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')
这可能适合您:

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')
如果你已经有约翰的身份证,只需要一个原始计数,那么这应该是可行的

select count(*) from person_hobby_combination where person_id=?

如果你已经有约翰的身份证,只需要一个原始计数,那么这应该是可行的

select count(*) from person_hobby_combination where person_id=?

个人姓名表是否唯一?看起来好像没有,所以可能有很多人的名字是John。名字在Person表中是uniques吗?看起来不是,所以可能有很多人叫约翰。我从来没有想过团体和重复的名字。谢谢你的建议。我从来没有想过团体和重复的名字。谢谢你的建议。
select count(*) from person_hobby_combination where person_id=?