首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对多个表进行分组的Mysql条件

对多个表进行分组的Mysql条件
EN

Stack Overflow用户
提问于 2014-06-16 14:24:33
回答 1查看 90关注 0票数 1

我想知道是否有人能为我的问题想出一个更优雅的解决方案。我很难找到类似的案子。

我有五张桌子。3是员工的详细情况,技能和次技能。剩下的两个是连接表。

skill_links

代码语言:javascript
复制
skill_id    subskill_id
1           4
1           5
2           4
2           6

emp_skill_links

代码语言:javascript
复制
employee_id    subskill_id    acquired
1              4              2013-04-05 00:00:00
1              5              2014-02-24 00:00:00
2              6              2012-02-26 00:00:00
2              5              2011-06-14 00:00:00    

两者都有多到多的关系。具备子技能(skill_links)和员工子技能(emp_skill_links)的技能。

我想挑选那些已经掌握了所有技能的员工。我试着用一个查询来完成它,但是无法通过所涉及的分组来管理它。目前,我的解决方案是两个单独的查询,稍后在php数组中匹配这些查询。这就是:

代码语言:javascript
复制
SELECT sl.skill_id, COUNT(sl.subskill_id) as expected
FROM skill_links sl
GROUP BY sl.skill_id

可与以下方面比较:

代码语言:javascript
复制
SELECT sl.skill_id, esl.employee_id, COUNT(esl.subskill_id) as provided
FROM emp_skill_links esl
INNER JOIN skill_links sl
ON sl.subskill_id = esl.subskill_id
GROUP BY sl.skill_id, esl.employee_id   

是否有更有效的单一查询解决方案来解决我的问题?还是不值得这么复杂?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-16 15:50:39

如果您认为一个由子查询组成的查询满足了您对“更有效的单一查询解决方案”的需求(取决于您对“单个查询”的定义),那么这将是可行的。

代码语言:javascript
复制
SELECT employeeTable.employee_id
FROM
  (SELECT sl.skill_id, COUNT(*) AS subskill_count
  FROM skill_links sl
  GROUP BY sl.skill_id) skillTable
  JOIN
  (SELECT esl.employee_id, sl2.skill_id, COUNT(*) AS employee_subskills
   FROM emp_skill_links esl
     JOIN skill_links sl2 ON esl.subskill_id = sl2.subskill_id
   GROUP BY esl.employee_id, sl2.skill_id) employeeTable
  ON skillTable.skill_id = employeeTable.skill_id
 WHERE employeeTable.employee_subskills = skillTable.subskill_count

查询所做的工作:

  • 选择每个技能的子技能计数。
  • 为每个员工选择每个主要技能的子技能计数。
  • 根据主要技能加入这些结果
  • 从有子技能计数的员工中选择与主要技能的子技能计数相等的员工。

演示

在is示例中,用户1和3各有主要技能1的所有子技能,用户2仅拥有主技能2的3项子技能中的2项。

您将注意到,这里的逻辑与您已经做的类似,但是它的优点是只有一个db请求(而不是两个),它不涉及PHP创建、循环、比较和减少数组的工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24245934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档