Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1521 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Requête multi jointures et regroupement

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Requête multi jointures et regroupement

n°1933810
drmedia
Posté le 20-10-2009 à 16:17:59  profilanswer
 

Bonjour à tous,
 
J'ai un problème avec une requête que je n'arrive pas à concevoir sur les tables ci-dessous :
 

Code :
  1. adherents
  2. -----------
  3. id
  4. id_chef
  5. chef [0,1]
  6. libelle

Un adhérent peut être un chef (chef [1]) ou peut être un sous-chef  (chef [0]) rattaché à un chef (id_chef)
 

Code :
  1. cotisations
  2. -----------
  3. id
  4. id_adherent
  5. annee
  6. montant


Je voudrais sortir la liste des adhérents de type "chef" dont :
- au moins un sous-chef ou le chef ont versé une cotisation en 2006
- au moins un sous-chef ou le chef ont versé une cotisation en 2008
- aucun des sous-chefs ni le chef n'ont versé de cotisation en 2007
 
En fait j'avais une requête qui fonctionnait très bien justement pour sortir la liste des adhérents sans prendre en compte les chefs et sous-chefs :
 

Code :
  1. SELECT a.id,a.libelle FROM adherent a
  2. RIGHT JOIN cotisations c1 ON c1.id_adherent = a.id
  3. RIGHT JOIN cotisations c2 ON c2.id_adherent = a.id
  4. WHERE c1.annee = '2008' AND c1.montant > 0
  5. AND c2.annee = '2006' AND c2.montant > 0
  6. AND a.id NOT IN (SELECT id_adherent FROM cotisations WHERE annee = '2007')
  7. GROUP BY a.id
  8. ORDER BY a.libelle ASC


 
J'aimerais en fait faire la même requête mais en ne sortant que les id des chefs mais en prenant en compte les cotisations du chef et de leurs sous-chefs.
Il faudrait pouvoir considérer un groupe d'adhérents (1 chef + n sous-chefs) comme un unique adhérent.
 
C'est peut être pas très clair ... ?
 
En tout cas je bloque complètement, merci d'avance ;)

mood
Publicité
Posté le 20-10-2009 à 16:17:59  profilanswer
 

n°1933819
skeye
Posté le 20-10-2009 à 16:22:07  profilanswer
 

tu peux donner un exemple de contenu des tables / résultat attendu?
J'ai un peu de mal à visualiser, là :D


---------------
Can't buy what I want because it's free -
n°1933910
drmedia
Posté le 20-10-2009 à 17:58:20  profilanswer
 

ADHERENTS
 

Code :
  1. id  id_chef  chef   libelle
  2. --------------------------------
  3. 1   3         0      adherent1
  4. 2   3         0      adherent2
  5. 3   0         1      chef1
  6. 4   5         0      adherent3
  7. 5   0         1      chef2


 
 
COTISATIONS
 

Code :
  1. id  id_adherent   annee   montant
  2. -------------------------------------------
  3. 1   1             2008      15
  4. 2   1             2006      12
  5. 3   3             2005      18
  6. 4   4             2007      23


 
Résultat attendu :
 

Code :
  1. id libelle
  2. ------------
  3. 3 chef1


 
Car le chef1 et ses sous-chefs (adherent1 et adherent2) ont versés au moins une fois en 2006 et 2008 et n'ont pas versé en 2007.


Message édité par drmedia le 20-10-2009 à 17:59:37
n°1934065
rufo
Pas me confondre avec Lycos!
Posté le 21-10-2009 à 09:47:27  profilanswer
 

la colonne "chef" ne sert à rien car en autorisant NULL comme id_chef, ça indique si c'est un chef. Après, le niveau dans l'arbo des chefs détermine si c'est un chef, un sous-chef ou un simple sous-fifre :)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°1934138
drmedia
Posté le 21-10-2009 à 11:32:42  profilanswer
 

En fait il n'y a que deux niveaux dans l'arbo : soit "chef" soit "pas chef"  
Un "pas chef" peut avoir un chef au dessus de lui ou pas.
Tu as raison sur la colonne "chef" mais j'avais pensé que dans la construction de ma requête cela pouvait simplifier.
 
 
 
Dans mes réflexions j'en suis à cette requête :
 

Code :
  1. SELECT a.id_chef,chef.libelle FROM adherent a
  2. LEFT JOIN adherent chef ON chef.id = a.id_chef
  3. RIGHT JOIN cotisations c1 ON c1.id_adherent = a.id
  4. RIGHT JOIN cotisations c2 ON c2.id_adherent = a.id
  5. WHERE chef.chef = 1
  6. AND c1.annee = '2008' AND c1.montant > 0
  7. AND c2.annee = '2006' AND c2.montant > 0
  8. AND a.id NOT IN (SELECT id_adherent FROM cotisations WHERE annee = '2007')
  9. GROUP BY a.id_chef
  10. ORDER BY chef.libelle ASC


 
Mais dans ce cas il faut que chaque chef id_chef=id...


Message édité par drmedia le 21-10-2009 à 11:34:41

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Requête multi jointures et regroupement

 

Sujets relatifs
JSF/JSP/Servlet : Impression sur requête HTTPProblème grosse requête PHP !
affichage des résultats d'une requête SQLProblème requête select avec double résultats
Des Tests Fonctionnels sur requête SQL[RESOLU]Optimisation d'une requête SQL
les fonctions "thread_safe" et la programmation multi-threadxslt 1.0 Regroupement de balises dans une balise mères
aide requête SQL : jointure tables 0-n 
Plus de sujets relatifs à : Requête multi jointures et regroupement


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR