mysql 这种情况怎么查?

2020-09-06 21:42:30 +08:00
 qaqLjj

如图,怎么查询同时掌握了第一张表所有技能的员工呢?

也就是说,希望的结果如下:

emp
神崎
相田

1189 次点击
所在节点    问与答
8 条回复
liuxey
2020-09-06 22:00:36 +08:00
select distinct emp from EmpSkills t1 where exists (select 1 from Skills t2 where t1.skill = t2.skill);
随手写的,稍微改改应该能用
liuxey
2020-09-06 22:03:31 +08:00
呃~,又没看清题目:
select emp from EmpSkills t1 where exists (select 1 from Skills t2 where t1.skill = t2.skill) group by t1.emp having count(*) > 3
缺点是要事先知道一共有几个 skill 和 EmpSkills 表不能用重复数据
qaqLjj
2020-09-06 22:26:30 +08:00
@liuxey 不行啊
AngryPanda
2020-09-07 06:24:27 +08:00
使用 group_concat 曲线救国应该可以。
jindeq
2020-09-07 08:51:56 +08:00
不推荐 sql 里写业务。
要是真的写可以用子表。
先把技能表每个技能标注成 s1,s2 等
再把用户技能表 group by skill, user
join 得到的两张表,on 的时候带上 skill 的条件

如果 skill 太多,这样就不现实了,推荐代码里处理
qaqLjj
2020-09-07 21:16:19 +08:00
昨天写出来了,忘记在这里更新了
qaqLjj
2020-09-07 21:43:54 +08:00
SELECT DISTINCT emp
FROM EmpSkills ES1
WHERE NOT EXISTS
(
SELECT skill
FROM Skills sk
WHERE NOT EXISTS
(SELECT skill
FROM EmpSkills ES2
WHERE ES1.emp = ES2.emp AND ES2.skill = sk.skill)
)
Aksura
2020-09-08 13:01:40 +08:00
如果是 8.0 直接分析函数就可以了。如果是 8.0 以前的版本,可以这样:

SELECT a.emp
FROM ( SELECT e.emp
, COUNT(DISTINCT s.skill) AS cnt
FROM EmpSkills e
JOIN Skills s
ON s.skill = e.skill
GROUP BY e.emp
) a
JOIN (SELECT COUNT(DISTINCT s.skill) AS cnt
FROM Skills s
) b
ON b.cnt = a.cnt
;

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/704684

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX