Php 将多对多表分组的Mysql条件

Php 将多对多表分组的Mysql条件,php,mysql,sql,database,Php,Mysql,Sql,Database,我想知道是否有人能想出一个更优雅的方法来解决我的问题。我很难找到类似的病例 我有五张桌子。3是员工、技能和辅助技能的详细信息。其余2个是链接表 技能链接 skill_id subskill_id 1 4 1 5 2 4 2 6 employee_id subskill_id acquired 1 4 2013-04-05 00:00:00 1

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

我有五张桌子。3是员工、技能和辅助技能的详细信息。其余2个是链接表

技能链接

skill_id    subskill_id
1           4
1           5
2           4
2           6
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    
emp_技能_链接

skill_id    subskill_id
1           4
1           5
2           4
2           6
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    
两者都有多对多的关系。具有次级技能的技能(技能链接)和具有次级技能的员工(emp技能链接)

我想挑选那些掌握了某项技能的所有次级技能的员工。我试着用一个查询来完成它,但无法用所涉及的分组来管理它。目前我的解决方案是两个独立的查询,稍后在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
查询的作用是:

  • 选择每个技能的子技能计数

  • 为每个主要技能的每个员工选择子技能的计数

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

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

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


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

是否与
员工id
技能id
有直接关系?否则就没有意义了,因为
subskill\u id
不是唯一的。在数据库结构中,我目前唯一的链接是通过技能链接。你的意思是只通过
subskill\u id
字段?那么它应该只在
subskill\u id
是唯一的情况下工作。subskill\u id是我关于员工subskills技能的唯一链接。我不知道你是什么意思。每个员工的子技能都是唯一的,但许多员工可以有匹配的子技能。这是一个简洁的解决方案。非常感谢。