簡體   English   中英

有點復雜的 MySql 查詢

[英]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=VBskill=VB and skill=CskillFreeRTOS and not skill=Windows

順便說一句,模式來自這個問題的答案它對我來說看起來不錯,但是......

在此處輸入圖片說明

找到所有具有 (skill="C++" and Skill="UML") 和 NOT(skill="Python") 的候選人

我會推薦group byhaving .

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM