Bonjour,
Pour commencer je vais exposer la structure de mes tables. Dans mon problème, 4 tables sont concernées.
profil(id INT, nom VARCHAR, prenom VARCHAR)
travail(id INT, #profil_id)
travail_competence(#travail_id INT, #competence_id INT)
competence(id INT, nom VARCHAR)
Explication rapide :
Un profil possède 0 ou PLUSIEURS travail.
Un travail possède 1 et 1 SEUL profil.
Un travail possède 0 ou PLUSIEURS competence.
Une competence possède 0 ou PLUSIEURS travail.
NOTE : Un profil peut donc avoir (indirectement) plusieurs fois la même competence.
Schema :

(J'ai simplifié les tables, la modélisation est bonne même si ici le nombre de table semble inadapté)
Ce que je cherche à faire :
Je veux retrouver une liste de Profil avec en condition d'entrée une liste de Competence. Le but étant de trouver les Profil possédant cette liste de Competence (toute la liste : "AND").
Le problème :
Mon problème vient bien évidemment du faite qu'un Profil ne possède pas directement les Competence, le lien est fait par la table Travail et travail_competence.
Notes :
Mon projet est réalisé en PHP sous Symfony2 et ma requête va être construite avec Doctrine2 en DQL.
Voilà pour les explications.
Début de solution :
Je pense être un peu plus avancé qu'au début de la rédaction de ce message.
Pas sûr que ça marche mais je pense être sur la bonne voie :
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
select profil_id, count(*) as nb
from(
select profil.id as profil_id, profil.nom as profil_nom, competence.id as competence_id
from profil, travail, competence, travail_competence
where profil.id = travail.profil_id
and travail.id = travail_competence.travail_id
and competence.id = travail_competence.competence_id
) as profil_competence
where competence_id = 56
or competence_id = 59
group by profil_id
having nb = 2 /* variable, en fonction du nombre de condition OR */
; |
Sachant que les condition
OR et le
HAVING seraient générés en fonction de la liste de compétence d'entrée
Je pense que je ne suis pas loin de la solution, peut-être qu'un
SELECT DISTINCT se montrera nécessaire vu qu'un profil peut avoir plusieurs fois la même compétence.
Je fais quelques tests.
Partager