IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Requête multi jointures


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 9
    Points : 3
    Points
    3
    Par défaut Requête multi jointures
    Bonjour à tous,

    Je bataille pour trouver la solution de mon problème que voici...

    Voici mes tables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    adherents
    -----------
    id
    id_chef
    chef [0,1]
    libelle
    Un adhérent peut être un chef (chef [1]) ou peut être un sous-chef (chef [0]) rattaché à un chef (id_chef)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    cotisations
    -----------
    id
    id_adherent
    annee
    montant
    Je voudrais sortir la liste des adhérents de type "chef" dont :
    - au moins un sous-chef a versé une cotisation en 2006
    - au moins un sous-chef a versé une cotisation en 2008
    - aucun des sous-chefs n'a versé de cotisation en 2007

    Je bloque complètement, merci d'avance

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 805
    Points
    30 805
    Par défaut
    Tu as surement déjà commencé des requêtes...
    Montre les nous. Nous t'aiderons à les mettre au point.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par drmedia Voir le message
    Je voudrais sortir la liste des adhérents de type "chef" dont :
    - au moins un sous-chef a versé une cotisation en 2006
    - au moins un sous-chef a versé une cotisation en 2008
    - aucun des sous-chefs n'a versé de cotisation en 2007

    Je bloque complètement, merci d'avance
    Une piste :
    Commence par écrire une requête qui va donner la liste des sous-chefs ayant réglé une cotisation en 2006 (ou en 2008 c'est quasiment pareil).
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Merci pour vos réponses rapides !

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT a.id,a.libelle FROM adherent a
    RIGHT JOIN cotisations c1 ON c1.id_adherent = a.id
    RIGHT JOIN cotisations c2 ON c2.id_adherent = a.id
    WHERE c1.annee = '2008' AND c1.montant > 0
    AND c2.annee = '2006' AND c2.montant > 0
    AND a.id NOT IN (SELECT id_adherent FROM cotisations WHERE annee = '2007')
    GROUP BY a.id
    ORDER BY a.libelle ASC
    J'aimerais en fait faire la même requête mais en ne sortant que les chefs ET 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.

    Merci encore

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Salut,

    Je te propose une requête qui pourrait faire l'affaire, mais je ne l'ai pas testée donc...
    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
    select t.annee,t.id_c,t.lib_chef
    from (select adh_cot.annee,a.id as id_c,a.libelle as lib_chef
    	     max(case when adh_cot.annee = 2006 then nb_cot else 0 end) as nb_cot_2006,
    	     max(case when adh_cot.annee = 2007 then nb_cot else 0 end) as nb_cot_2007,
    	     max(case when adh_cot.annee = 2008 then nb_cot else 0 end) as nb_cot_2008
          from (select c.annee,adh.id_chef,count(*) as nb_cot
    	    from adherent adh
    	    JOIN cotisation c ON adh.id=c.id_adherent
    	    where c.annee in (2006,2007,2008)
    	    and adh.chef=0
    	    group by c.annee,adh.id_chef
    	    ) as adh_cot 
          left join adherent a ON adh_cot.id_chef = a.id
          group by adh_cot.annee,a.id,a.libelle
          ) as t
    where t.nb_cot_2006 > 0
    and t.nb_cot_2007 = 0
    and t.nb_cot_2008 > 0
    Dans la requête je suppose qu'il y a au moins une cotisation par an (peu importe le sous-chef évidemment) mais si ce n'est pas le cas il te faut une table calendrier ou alors il faudra la simuler
    Je passe par un pivot (le max(case) ), il y a probablement d'autres méthodes mais avec mysql (c'est çà ?) on est plus limité.

    Si ça ne passe pas et que tu ne t'en sorts pas, peux tu nous fournir un jeux de test stp

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 9
    Points : 3
    Points
    3
    Par défaut
    Merci BEAUCOUP pour la requête, je vais la tester cette après-midi, mais en tout cas dans la construction je pense que c'est une bonne solution ! Merci !

    ADHERENTS

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    id  id_chef  chef   libelle
    --------------------------------
    1   3         0      adherent1
    2   3         0      adherent2
    3   0         1      chef1
    4   5         0      adherent3
    5   0         1      chef2

    COTISATIONS

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    id  id_adherent   annee   montant
    -------------------------------------------
    1   1	            2008      15
    2   1	            2006      12
    3   3	            2005      18
    4   4	            2007      23
    Résultat attendu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    id	libelle	
    ------------
    3	chef1

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Salut,

    Merci pour le jeux de test, j'avais eu un peu la flème de le créer hier.
    Donc je viens de tester, et dans la sous-requête je groupe par année, et évidemment ça génère une ligne de trop pour faire les tests =0 and > 0

    Donc plutôt la requête suivante :
    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
    SELECT t.id_c,t.lib_chef
    FROM (SELECT a.id AS id_c,a.libelle AS lib_chef,
    	     max(case when adh_cot.annee = 2006 then nb_cot else 0 end) AS nb_cot_2006,
    	     max(case when adh_cot.annee = 2007 then nb_cot else 0 end) AS nb_cot_2007,
    	     max(case when adh_cot.annee = 2008 then nb_cot else 0 end) AS nb_cot_2008
          FROM (SELECT c.annee,adh.id_chef,count(*) AS nb_cot
    	    FROM adherent adh
    	    JOIN cotisation c ON adh.id=c.id_adherent
    	    WHERE c.annee IN (2006,2007,2008)
    	    AND adh.chef=0
    	    GROUP BY c.annee,adh.id_chef
    	    ) adh_cot 
          LEFT JOIN adherent a ON adh_cot.id_chef = a.id
          GROUP BY a.id,a.libelle
          ) t
    WHERE t.nb_cot_2006 > 0
    AND t.nb_cot_2007 = 0
    AND t.nb_cot_2008 > 0

Discussions similaires

  1. Optimisation requête multi jointures
    Par MimiWoOlf dans le forum Requêtes
    Réponses: 4
    Dernier message: 29/05/2015, 19h12
  2. [MySQL-5.5] Multi jointures dans requête
    Par Pierre-Jérôme LUBAC dans le forum Requêtes
    Réponses: 2
    Dernier message: 02/12/2014, 15h44
  3. Requête multi tables Jointures et agrégations
    Par Al3x dans le forum Requêtes
    Réponses: 2
    Dernier message: 11/05/2010, 17h56
  4. Requète multi-tables relationnelles avec jointure
    Par alextva dans le forum Requêtes
    Réponses: 2
    Dernier message: 03/11/2009, 09h43
  5. [Conseils] Vue plutôt qu'une requête de multi-jointures
    Par etiennegaloup dans le forum Langage SQL
    Réponses: 1
    Dernier message: 07/11/2005, 17h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo