【问题标题】:Unable to make a suitable query无法进行合适的查询
【发布时间】:2019-11-14 00:28:03
【问题描述】:

我正在尝试创建一个数据库。它有以下表格子集

  1. 工作(job_id,描述)
  2. 技能(skill_id,技能)
  3. jobs_and_skills(job_id,skill_id)
  4. applicant_skill (applicant_id , Skills_id)

我的查询必须是:查找具有给定工作 ID 所需技能的申请人

我使用一系列子查询做了类似的事情

select DISTINCT applicant_id
from applicant_skill
where  skill_id in
(select DISTINCT skill_id
from jobs_and_skill
where  job_id in (select job_id
from jobs
where description ="research"));

但是在这里,如果我有一份需要技能的工作,比如 A、B、C,而我有一个只有技能 A 的候选人,它也会返回那个候选人。有没有办法找到具有所有技能 A、B、C 的候选人,而不是只返回所需技能子集的候选人

【问题讨论】:

  • applicant_skill 中的第二列不应该是skill_id 而不是skills
  • 另外,你不是有一个单独的表用于applicants,比如(applicant_id, name, ...)吗?
  • @GMB 确实我有一个单独的表格供申请人使用,而且申请者技能应该有技能 ID 作为第二列

标签: mysql database join count sql-in


【解决方案1】:

使用JOIN 而不是IN。然后,您可以加入一个计算工作所需技能数量的子查询,并将其与申请人共同拥有的技能数量进行比较。

SELECT as.applicant_id
FROM applicant_skill AS as
JOIN jobs_and_skills AS js ON js.skill_id = as.skill_id
JOIN jobs AS j ON j.job_id = js.job_id
JOIN (
    SELECT job_id, COUNT(*) AS skill_count
    GROUP BY job_id
) AS jsc ON j.job_id = jsc.job_id
WHERE j.description = "research"
GROUP BY as.applicant_id
HAVING COUNT(*) = jsc.skill_count

【讨论】:

    【解决方案2】:

    在加入applicants之前,您可以为jobs_and_skill准备subquery

    select * from applicant_skill t1
    inner join 
        (select t2.skill_id from 
            jobs_and_skill t2
            inner join skills t3 on t3.skill_id = t2.skill_id
            inner join jobs t4 on t4.job_id = t2.job_id
            where t4.description  = 'research') as t 
        on t1.skill_id = t.skill_id
    

    【讨论】:

      【解决方案3】:

      您可以加入jobsapplicants,条件是确保申请人具备所有工作技能。

      select 
          j.*,
          a.*
      from 
          jobs j
          inner join applicants a on not exists (
              select 1
              from job_and_skills js
              left join applicant_skills as
                  on  as.applicant_id = a.applicant_id
                  and as.skill_id = js.skill_id
              where 
                  js.job_id = j.job_id
                  and as.applicant_id is null
          )
      where j.description = 'research'
      

      连接条件使用not exists 条件使用左连接反模式,其表述如下:该工作没有要求的技能,申请人不拥有。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-11
        • 2019-12-25
        • 1970-01-01
        • 2014-03-25
        • 1970-01-01
        • 2019-03-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多