查询中的MySQL子查询

时间:2016-03-07 16:32:37

标签: mysql sql subquery relation

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

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中,我定义了员工技能。

我想要做的是运行一个如果员工需要技能则返回true或false的查询。

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

2 个答案:

答案 0 :(得分:1)

所以我理解它的方式,你要确保,给定的员工拥有该文件所需的所有技能。

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

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,你返回false,否则为true。

答案 1 :(得分:0)

这不是超级漂亮..但它允许您选择所有员工以及他们是否有权访问。它将装配所需技能的计数与员工对装配的技能计数进行比较。

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的建议可以实现并且更清洁。