2016-03-07 106 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 /接受答案?) –