有点复杂的MySql查询

时间:2019-05-01 18:42:12

标签: mysql sql

下面的示意图。基本上,最底层是技能,然后是工作,然后是应聘者(暂时忽略公司)。每个技能可以与多个职位相关联,并且一个职位可以具有多个技能。每个职位都适用于一个候选人,该候选人可以拥有(拥有)多个(历史性)职位,每个职位由一个公司组成。

我只是不知道要查找所有技能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

顺便说一句,该模式来自this question的答案,对我来说不错,但是...

enter image description here

3 个答案:

答案 0 :(得分:1)

  

使用(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;

需要注意的是,这使技能与职位相关,而不是直接与求职者相关。也许这是您定义技能的必要条件,但很可能您根本没有某些应聘者的某些技能的工作。

答案 1 :(得分: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'
    )

这里的问题是技能与应聘者无关,但与工作有关。因此,候选人本可以加入工作,但并没有透露他的真正技能。为了使查询更直接,更易理解,应将技能与候选人直接联系起来。

答案 2 :(得分:0)

可能正在使用子查询来查询Skill_name IN IN('C ++','UML')联接到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连接

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