【问题标题】:How to get all many to one rows with a specified where condition?如何获得具有指定 where 条件的所有多对一行?
【发布时间】:2020-09-05 19:41:15
【问题描述】:

在我有多个人并且每个人都可以有很多爱好的情况下,我该如何做到这一点,以便我选择其中具有特定爱好的人以及所有其他爱好。如果我使用 where 子句,则查询只返回指定的爱好而没有其他人

就像,从所有人中向我展示喜欢进行网络钓鱼的人,并展示我的所有其他爱好。

我无法解释清楚,I've made a JsFiddle

我怎样才能做到这一点,以便我可以看到迈克的所有其他爱好,但要确保其中之一是格斗?

SELECT name, GROUP_CONCAT(HobbyName) 
FROM people  
    INNER JOIN peoples_hobbies ON pId = peopleId 
    INNER JOIN hobby ON hobbyId = hId 
WHERE HobbyName = 'Fighting' 
GROUP BY name

/* 如果我这样做,那么它只会选择我想要的爱好, 我指定的爱好以及属于那个人的所有其他爱好?*/

【问题讨论】:

    标签: mysql sql string join group-by


    【解决方案1】:

    从您现有的查询开始,您只需添加一个having 子句来过滤具有特定爱好的人:

    SELECT p.name, GROUP_CONCAT(h.HobbyName) hobbies
    FROM people p
    INNER JOIN peoples_hobbies ph ON p.pId = ph.peopleId 
    INNER JOIN hobby h ON ph.hobbyId = h.Id 
    GROUP BY p.pId, p.name
    HAVING MAX(h.HobbyName = 'Fighting')
    

    旁注:

    • 在多表查询中,总是用它所属的表来限定每一列 - 这使得查询更容易理解,并避免在两个不同的表有一个列时出现歧义同名

    • HAVING MAX(h.HobbyName = 'Fighting') 是 MySQL 的快捷方式,表示 HAVING MAX(CASE WHEN h.HobbyName = 'Fighting' THEN 1 ELSE 0 END) = 1

    • people 表的主键添加到group by 子句更安全,因为它可以正确处理同音异义词

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-16
      • 2016-09-30
      相关资源
      最近更新 更多