如何获得具有指定 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子句在SQL中有重复的条件值,如何获取多行

SQL多对多,如何检查多行的条件

如何合并两个或多个具有不同 where 条件的查询?我必须重用在第一个代码中使用的代码

CodeIgniter:如何使用活动记录将一个列值移动到另一个具有 Where 条件的值

如何在结果集中获得 WHERE 条件评估的结果?

rownum