Bonjour,
Je suis pas expert en SQL et je rencontre une grosse difficulté sur un problème qui me paraissait simple.
Pour faire le plus simple possible (en réalité il y a des tables intermédiaires mais cela n'est pas pertinent pour l'exemple),
dans une base de donnée (postgres) j'ai :
- d'un coté des utilisateurs qui possèdent une liste d'aptitudes
- d'un autre coté j'ai des taches qui nécessitent certaines aptitudes et inaptitudes (une liste d'aptitude et une liste d'inaptitudes).
Pour un utilisateur donné je souhaite récupérer toutes les taches compatibles avec ses aptitudes/inaptitudes (certaines taches requièrent que la personne soit inapte).
je suis arrivé à un truc comme ca:
ce qui me donne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 select prerequis.id as prerequis_id, (select count(*) from prerequis_aptitudes where prerequis_aptitudes.id_prerequis=prerequis.id) as nb_apt, (select count(*) from prerequis_inaptitudes where prerequis_inaptitudes.id_prerequis=prerequis.id) as nb_inapt, (select count (*) from ( select id_aptitude from prerequis_aptitudes where prerequis_aptitudes.id_prerequis=prerequis.id intersect select aptitude.id from usdata join usdata_aptitudes on usdata.id = usdata_aptitudes.id_usdata join aptitude on usdata_aptitudes.id_aptitude = aptitude.id where usdata.user_id=759) as popo) as user_apt, (select count (*) from ( select id_aptitude from prerequis_inaptitudes where prerequis_inaptitudes.id_prerequis=prerequis.id intersect select aptitude.id from aptitude Where aptitude.id not in(select id_aptitude from usdata join usdata_aptitudes on usdata.id = usdata_aptitudes.id_usdata where usdata.user_id=759)) as poo ) as user_inapt from prerequis
Avec ça je cree une vue(depuis une procedure stockée pour passer le userid en paramètre) puis un select avec un where pour comparer les count de valeurs nb_* / user_*.
Bref c'est une vrai usine à gaz et je pense que quelqu'un de plus péchu que moi aura surement une solution plus simple et plus élégante.
Si en plus je peux le transcrire en JPA cela serait merveilleux.
Merci beaucoup.
Partager