如图,怎么查询同时掌握了第一张表所有技能的员工呢?
也就是说,希望的结果如下:
emp
神崎
相田
1
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);
随手写的,稍微改改应该能用 |
2
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 表不能用重复数据 |
4
AngryPanda 2020-09-07 06:24:27 +08:00 via Android
使用 group_concat 曲线救国应该可以。
|
5
jindeq 2020-09-07 08:51:56 +08:00 via Android
不推荐 sql 里写业务。
要是真的写可以用子表。 先把技能表每个技能标注成 s1,s2 等 再把用户技能表 group by skill, user join 得到的两张表,on 的时候带上 skill 的条件 如果 skill 太多,这样就不现实了,推荐代码里处理 |
6
qaqLjj OP 昨天写出来了,忘记在这里更新了
|
7
qaqLjj OP 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) ) |
8
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 ; |