【发布时间】:2019-05-09 13:36:29
【问题描述】:
我有三个这样的表:
人:
编号 |姓名 |性别 -------------------------- 1乔男 2 丹尼尔男 3 莎拉女person_skills:
人名 |技能ID -------------------------- 1 1 1 2 1 3 2 1 2 2 ...技能:
编号 |技能名称 ---------------------- 1 写作 2 编程 3 唱歌 ...当我只在我的查询中发送他们的一项技能时,我需要获取他们的所有技能。
这是我的代码:
SELECT a.name, a.gender,
GROUP_CONCAT(DISTINCT c.skill_name),
GROUP_CONCAT(DISTINCT c.id as skill_id)
FROM persons a
LEFT JOIN person_skills b ON b.person_id = a.id
LEFT JOIN skills c ON c.id = b.skill_id
WHERE b.skill_id = 3 GROUP BY a.id
我想要结果:
姓名 |性别 |技能名 |技能ID ---------------------------------------------- 乔男写作 1 编程 2 唱歌 3但是这段代码只返回skill_id“3”和skill_name“Singing”。
提前致谢。
【问题讨论】:
-
您的 SQL 甚至没有意义,因为它引用了不存在的列...但同样,您是否要问:“我如何获得所有技能的列表有“唱歌”技能的人吗?
-
忽略错别字,您需要引用
person_skills两次;首先获得技能 3 的人,然后再获得这些人的技能。 -
把你的 WHERE 子句改成
WHERE a.id = (SELECT b.person_id FROM person_skills WHERE skill_id = 3),我想你会得到你想要的。 -
@Uueerdo 是的,我试过了,效果很好。但我正在寻找一种更快的方法。
-
@Jake 不太可能有更快的方法,除非您的做法与我假设的不同(例如,请参阅我的答案)。更多的表引用并不一定等于更慢。
标签: mysql sql group-by left-join group-concat