MySQL 查询中的子查询

MySQL subquery in query

我的项目中有这个数据库结构。

nf_assembly_skills

part_id skill_id
    265        1
    265        2

nf_employee_skills

employee_id skill_id
          1        1
          3        2

nf_skills

id name
 1 Cutting
 2 Assembly
 3 Special Cutting
 4 Special Assembly

nf_assembly

 part_id part_number   part_description instruction                       lead_time ctime
       4 STR1019-ISS-3 HA-BSz1R,DMOSA/B <span style="font-weig...      3600     0

我在nf_skills技能列表中定义。 在 nf_assembly 文件列表中。 在 nf_assembly_skills 中,我定义了访问文档所需的技能。 在 nf_employee_skills 中,我定义了员工技能。

我想做的是 运行 一个查询 return 判断员工是否具备所需技能。

我尝试加入 运行 WHERE IN 和 LEFT JOIN 表,但没有任何效果。无论如何,这可能吗?

按照我的理解,您需要确保给定的员工具备该文件所需的所有技能。

我可能会通过创建一个将员工和他们想要访问的文档作为输入的函数来解决这个问题。您可以在那里进行查询,基本上计算员工不具备的所需技能的数量。 像这样:

select count(*)
from nf_assembly_skills a left join nf_employee_skills b on a.skill_id=b.skill_id
where a.part_id = [input part_id]
and b.employee_id = [input employee id]
and b.skill_id is null

如果计数 > 0,则您 return 为假,否则为真。

这不是很漂亮.. 但它可以让您 select 所有员工以及他们是否有访问权限。它将装配所需技能的数量与员工在该装配中拥有的技能数量进行比较。

select pskills.part_id, epskills.employee_id,
case when epskills.num >= pskills.num then 'true' else 'false' end as [Access]
from (
    select part_id, count(distinct skill_id) as num
    from nf_assembly_skills
    --where part_id = 264
    group by part_id ) pskills  
inner join (
    select part_id, employee_id, count(distinct a.skill_id) as num
    from nf_assembly_skills a
    inner join nf_employee_skills e on a.skill_id = e.skill_id
    --where part_id = 264 and employee_id = 1
    group by part_id, employee_id) epskills 
on pskills.part_id = epskills.part_id

如果您只想同时处理一名员工和集会,您可以取消注释这两个 where 子句,尽管 Nikoline 的建议可以实现这一点并且更简洁。