Несколько сложный MySql-запрос - PullRequest
1 голос
/ 01 мая 2019

Схема ниже.По сути, в нижней части находятся навыки, затем рабочие места, а затем кандидаты (пока игнорируйте компании).Каждый навык может быть связан с несколькими заданиями, а задание может иметь несколько умений.Каждое задание относится к одному кандидату, который может иметь (имел) несколько (исторических) заданий, каждое с одной компанией.

Я просто не могу выяснить запросы, чтобы найти всех кандидатов со скиллом X.

На самом деле, это усложняется, потому что X - это не просто один навык, это может быть несколько навыков, с булевыми операторами, такими как

, чтобы найти всех кандидатов с помощью (skill = ")C ++ "и 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

Кстати, схема пришла от ответа на на этот вопрос Мне это нравится, но ...

enter image description here

Ответы [ 3 ]

1 голос
/ 01 мая 2019

найти всех кандидатов с (skill = "C ++" и 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;

Предостережение заключается в том, что это позволяет получить навыки, связанные с заданиями , а не непосредственно с кандидатом. Возможно, это является требованием для вашего определения навыка, но возможно, что у вас просто нет работы по некоторым навыкам для некоторых кандидатов.

0 голосов
/ 01 мая 2019

может использовать подзапрос для 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 
0 голосов
/ 01 мая 2019

Может быть что-то вроде этого (не проверено в редакторе)

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'
    )

Проблема здесь в том, что навыки связаны не с кандидатом, а с работой.Таким образом, кандидат мог присоединиться к работе, но это не раскрывает его реальных навыков.Для более простой и понятной модели выполнения этого запроса навыки должны быть напрямую связаны с кандидатом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...