如何使用指定的where条件获取所有多对一行?

g6ll5ycj  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(237)

在一个场景中,我有多个人,每个人都可以有许多爱好,我如何才能使它,所以我选择的人,其中有一个特定的爱好,但也所有其他爱好。如果我使用where子句,查询只返回指定的hobby而不返回其他的hobby
就像,从所有的人显示我的人,喜欢去钓鱼,也显示我的所有其他爱好。
我没法向你解释,我需要一把小提琴
我怎样才能让我看到迈克的所有其他爱好,但确保其中一个是战斗?

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

/如果我这么做的话,克莱苏做的地方,所以它只选择了那个爱好,我想要得到的,我指定的爱好,还有属于那个人的所有其他爱好/

chhkpiq4

chhkpiq41#

从现有查询开始,只需添加 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') 是一条捷径 HAVING MAX(CASE WHEN h.HobbyName = 'Fighting' THEN 1 ELSE 0 END) = 1 添加 people 表到 group by 子句更安全,因为它可以正确处理同音异义词

相关问题