【问题标题】:How to SQL in many-to-many relationship如何在多对多关系中使用 SQL
【发布时间】:2011-11-06 07:27:44
【问题描述】:

我想显示约翰有多少爱好。你能告诉我怎么写SQL语句吗?

PERSON 表

ID | NAME
1 | John

爱好表

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

【问题讨论】:

  • Person 表中的名称是否唯一?看起来没有,所以可能有很多人姓约翰。

标签: sql many-to-many


【解决方案1】:

这可能对你有用:

选择 h.name, CASE WHEN PH.ID IS NULL THEN 'No' ELSE 'Yes' END AS hobby_exist FROM 爱好 h CROSS JOIN 人 p 左连接 person_hobby_conbination ph ON (ph.p_id = p.id AND ph.h_id = h.id) WHERE (p.name = 'John')

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

    • 我从来没有想过组名和重名。感谢您的建议。
    【解决方案3】:

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

    select count(*) from person_hobby_combination where person_id=?
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-03
      • 1970-01-01
      • 1970-01-01
      • 2010-09-25
      • 1970-01-01
      • 2015-08-05
      • 1970-01-01
      • 2018-02-17
      相关资源
      最近更新 更多