如何获得具有指定 where 条件的所有多对一行?
Posted
技术标签:
【中文标题】如何获得具有指定 where 条件的所有多对一行?【英文标题】:How to get all many to one rows with a specified where condition? 【发布时间】: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
/* 如果我这样做,那么它只会选择我想要的爱好, 我指定的爱好以及属于那个人的所有其他爱好?*/
【问题讨论】:
【参考方案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
子句更安全,因为它可以正确处理同音异义词
【讨论】:
以上是关于如何获得具有指定 where 条件的所有多对一行?的主要内容,如果未能解决你的问题,请参考以下文章
如何合并两个或多个具有不同 where 条件的查询?我必须重用在第一个代码中使用的代码