[英]Somewhat complex MySql query
示意圖如下。 基本上,底部是技能,然后是工作,然后是候選人(暫時忽略公司)。 每個技能可以與多個工作相關聯,一個工作可以有多個技能。 每個職位都適用於一個候選人,他可以擁有(擁有)多個(歷史)職位,每個職位都與一家公司有關。
我只是無法弄清楚找到所有具有技能 X 的候選人的查詢。
事實上,它變得復雜了,因為X不僅僅是一個單一的技能,它可以是多個技能,用布爾運算符,比如
找到所有具有 (skill="C++" and Skill="UML") 和 NOT(skill="Python") 的候選人
其中(skill="C++" and skill="UM"L) and NOT(skill="Python")
部分是一個字符串,它應該包含一個有效的 ,SQl 子查詢,但我無法弄清楚其余部分查詢。
[更新] 當我說“例如”時,我並不是指那個查詢字符串。 我試圖找到一種處理任何技能查詢字符串的方法。 例如, skill=VB
或skill=VB and skill=C
或skillFreeRTOS and not skill=Windows
順便說一句,模式來自這個問題的答案它對我來說看起來不錯,但是......
找到所有具有 (skill="C++" and Skill="UML") 和 NOT(skill="Python") 的候選人
我會推薦group by
並having
.
select j.candidate_id
from jobs j join
skills s
on j.job_id = s.job_id join
skill_names sn
on sn.skill_id = s.skill_id
group by j.candidate_id
having sum(s.skill_name = 'C++') > 0 and
sum(s.skill_name = 'UML') > 0 and
sum(s.skill_name = 'Python') = 0;
需要注意的是,這將獲得與工作相關的技能,而不是直接與候選人相關的技能。 也許這是您對技能定義的要求,但您可能根本沒有針對某些候選人的某些技能的工作。
也許是這樣的(未在編輯器中測試)
select distinct c.candidate_id
from candidates c
where
exists (
select 1
from skill_names sn
join skills s
on sn.skill_id=s.skill_id
join jobs j
on s.job_id=j.job_id
and j.candidate_id=c.candidate_id
where sn.skill_name='C++'
) and
exists (
select 1
from skill_names sn
join skills s
on sn.skill_id=s.skill_id
join jobs j
on s.job_id=j.job_id
and j.candidate_id=c.candidate_id
where sn.skill_name='UML'
) and
not exists (
select 1
from skill_names sn
join skills s
on sn.skill_id=s.skill_id
join jobs j
on s.job_id=j.job_id
and j.candidate_id=c.candidate_id
where sn.skill_name='Phyton'
)
這里的問題是技能與候選人無關,而與工作有關。 所以候選人本可以加入這份工作,但這並沒有透露他的真正技能。 對於執行該查詢的更直接和易於理解的模型,技能應該與候選人直接相關。
可能正在使用子查詢的 Skill_name IN IN ('C++', 'UML') join to skill_name NOT IN ('Python')
select c.*
from camdidates c
inner join jobs j on c.candate_id = j.candidate_id
inner join (
select sn.skill_id, sn.job_id
from skill_name sn
inner join skill s1 on s1.skill_id = sn.skill_id
and s.skill_name IN ('C++', 'UML')
inner join skill s2 on s2.skill_id = sn.skill_id
and s2.skill_name NOT IN ('Python')
) t on t.job_id = j.job_id
但是如果你想要“C++”和“UML”,那么可以使用 3 join with Skill
select c.*
from camdidates c
inner join jobs j on c.candate_id = j.candidate_id
inner join (
select sn.skill_id, sn.job_id
from skill_name sn
inner join skill s1 on s1.skill_id = sn.skill_id
and s1.skill_name = 'C++'
inner join skill s3 on s1.skill_id = sn.skill_id
and s3.skill_name = 'UML'
inner join skill s2 on s2.skill_id = sn.skill_id
and s2.skill_name <> 'Python'
) t on t.job_id = j.job_id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.