2016-03-07 175 views
0

我的项目中有这个数据库结构。查询中的MySQL子查询

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。

我尝试加入运行的地方,也左连接表,但没有任何工作。无论如何,这是可能的吗?

+0

该屏幕截图不包含表'nf_assembly'的结构。此外,“运行一个查询,如果员工具有所需技能,则返回true或false”。 *你的意思是,需要技能来访问一个特定的文件?* –

+0

@SatwikNadkarny我用nf_assembly结构更新了屏幕截图。是的,我想获得查询,返回访问单个文档。 – pr0metheus

回答

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的建议能实现这一点,干净多了。

+0

谢谢,那正是我寻找的! – pr0metheus

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。

+0

感谢您的回答 – pr0metheus

+0

它有帮助吗? (如果它确实有帮助,你会介意upvoting /接受答案?) –