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 的建议可以实现这一点并且更简洁。
我的项目中有这个数据库结构。
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 的建议可以实现这一点并且更简洁。