繁体   English   中英

将多对多表分组的MySQL条件

[英]Mysql conditions with grouping many-to-many tables

我想知道是否有人可以想到一个更优雅的解决方案来解决我的问题。 我很难找到类似的情况。

我有5张桌子。 3是有关员工,技能和子技能的详细信息。 其余2个是链接表。

skill_links

skill_id    subskill_id
1           4
1           5
2           4
2           6

emp_skill_links

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数组中进行匹配。 那是:

SELECT sl.skill_id, COUNT(sl.subskill_id) as expected
FROM skill_links sl
GROUP BY sl.skill_id

与:

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   

有没有更有效的单查询解决方案来解决我的问题? 还是不值得涉及复杂性?

如果您认为由子查询组成的查询满足您对“更有效的单个查询解决方案”的要求(取决于您对“单个查询”的定义),那么它将起作用。

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

查询的作用:

  • 选择每种技能的子技能数

  • 为每个雇员选择每个主要技能的子技能数量

  • 根据主要技能加入这些结果

  • 从子技能计数等于主要技能子技能计数的员工中选择员工

DEMO

在示例中,用户1和3每个都有主要技能1的所有子技能。用户2仅拥有主要技能2的3个子技能中的2个。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM