0
votes

Impossible de faire une requête appropriée

J'essaie de faire une base de données. Il a suivi un sous-ensemble de tables

  1. emplois (job_id, description)
  2. compétences (compétences de compétences)
  3. emplois_and_skills (job_id, compétence_id)
  4. candidat_skill (candidat_id, compétences_id)

    Ma requête doit être: trouvez les candidats qui ont des compétences requises par un identifiant d'emplois donné

    J'ai fait quelque chose comme ça à l'aide d'une série de sous-requêtes xxx

    Mais ici si j'ai un travail qui nécessite des compétences, dit A, B, C et j'ai un candidat qui possède une compétence une compétence que cela retournera également ce candidat également. Existe-t-il un moyen de trouver un candidat qui a toutes les compétences A, B, C et ne pas renvoyer les candidats à un seul sous-ensemble de compétences requises


3 commentaires

Si la deuxième colonne de candidate_skill être skill_id au lieu de compétences ?


De plus, vous n'avez pas une table séparée pour demandeurs , comme (candidat_id, nom, ...) ?


@Gmb en effet, j'ai une table séparée pour les candidatures et aussi candidat_skill devrait avoir des compétences_id comme une deuxième colonne


3 Réponses :


1
votes

Utiliser rejoindre code> plutôt que dans code>. Ensuite, vous pouvez vous joindre à une sous-requête qui compte le nombre de compétences requis et comparer cela avec le nombre de compétences que le demandeur a en commun.

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


0 commentaires

1
votes

Vous pouvez préparer sous-requête code> pour homologiciels_and_skill avant de vous joindre à candidats code>.

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


0 commentaires

1
votes

Vous pouvez rejoindre emplois code> et candidats code> avec une condition qui garantit que le demandeur a toutes les compétences professionnelles.

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'


0 commentaires