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 :

Aucun groupe avec jointure externe


Sujet :

Langage SQL

  1. #1
    Débutant
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    1 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 125
    Points : 704
    Points
    704
    Par défaut Aucun groupe avec jointure externe
    Bonjour,

    Je voudrais compter le nombre de groupe par application.
    Mais le problème est la que la requête suivante ne me retourne pas les applications avec 0 groupe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT count(app.id_application) AS nb
    FROM application as app
    INNER JOIN application_groupe as app_group ON app_group.id_application = app.id_application
    INNER JOIN groupe as groupe ON app_group.id_groupe = groupe.id_groupe
    GROUP BY app.id_application, app.nom
    table groupe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    id     nom
    1     group1
    2     group2
    3     group3

    table application

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    id     nom
    1     app1
    2     app2
    3     app3

    table application_groupe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    id_group   id_app
    1         1
    2         1
    2         2
    Merci

  2. #2
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    salut,

    comme tu le dis dans ton titre, il faut que tu regardes du côté des jointures externes (left join, riht join)

  3. #3
    Débutant
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    1 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 125
    Points : 704
    Points
    704
    Par défaut
    J'ai essayé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LEFT OUTER JOIN groupe AS groupe ON app_group.id_groupe = groupe.id_groupe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RIGHT OUTER JOIN groupe AS groupe ON app_group.id_groupe = groupe.id_groupe
    Mais sans succès...

  4. #4
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    ta jointure externe doit se faire entre application et application_groupe si j'ai bien compris

  5. #5
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Ta requête ne SELECT qu'un comptage. Elle ne retournera donc qu'une série de nombres, sans que tu saches à quelle application correspond chaque nombre !

    Je voudrais compter le nombre de groupe par application.
    Pourquoi comptes-tu les id_application ?

    Tu veux avoir toutes les applications et le comptage des groupes quand il en existe. Tu va donc compter le nombre de fois qu'une application est associée à un groupe dans la table associative 'application_groupe', et ce pour chaque application.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT a.nom, COUNT(ag.*) AS Nb
    FROM application AS a
    LEFT JOIN application_groupe AS ag ON a.id_application = ag.id_application
    GROUP BY a.nom
    ORDER BY a.nom

  6. #6
    Débutant
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    1 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 125
    Points : 704
    Points
    704
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT a.nom, COUNT(ag.*) AS Nb
    FROM application AS a
    LEFT JOIN application_groupe AS ag ON a.id_application = ag.id_application
    GROUP BY a.nom
    ORDER BY a.nom
    Sauf que cette requête retourne plus de groupe que prévu...

    Je m'explique :
    Si un groupe n'existe pas dans la table groupe (id = 4 par exemple),
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    id     nom
    1     group1
    2     group2
    3     group3
    Et qu'il est répertorié dans application_groupe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    id_group   id_app
    1         1
    2         1
    2         2
    4         2
    Je ne veux pas qu'il soit comptabilisé.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 77
    Points : 84
    Points
    84
    Par défaut
    Alors tu dois aussi faire une jointure avec la table groupe et faire ton count sur un champ de cette table groupe.

    Maintenant, je ne comprends pas comment tu peux avoir un id_group dans la table application_groupe qui n'existe pas dans la table groupe. Pour moi, ceci est une erreur de logique dans la base.

  8. #8
    Débutant
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    1 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 125
    Points : 704
    Points
    704
    Par défaut
    Citation Envoyé par dragon74 Voir le message
    Alors tu dois aussi faire une jointure avec la table groupe et faire ton count sur un champ de cette table groupe.
    Requête final :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT a.nom, COUNT(g.id_groupe) AS Nb
    FROM application AS a
    LEFT JOIN application_groupe AS ag ON a.id_application = ag.id_application
    LEFT JOIN groupe AS g ON g.id_groupe = ag.id_groupe
    GROUP BY a.nom
    ORDER BY a.nom
    Citation Envoyé par dragon74 Voir le message
    Maintenant, je ne comprends pas comment tu peux avoir un id_group dans la table application_groupe qui n'existe pas dans la table groupe. Pour moi, ceci est une erreur de logique dans la base.
    Je sais, moi aussi je comprend pas mais je reprends une BDD et du code existant donc je fais avec.

    L'essentiel, c'est que la requête est bonne.
    Merci à toi

  9. #9
    Expert éminent sénior
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    S'il y a, dans la table associative, des id_x qui sont absents des tables de référence de ces clés étrangères, les lignes contenant ces id absents sont des données mortes et peuvent être supprimées !
    A quoi sert de savoir que l'id_groupe 4 est associé à l'id_application 2 si on ne peut pas retrouver à quoi correspond l'id_group 4 ou l'id_application 2 ?
    A rien !

    D'où l'intérêt d'implémenter correctement les contraintes de clés étrangères et d'utiliser un moteur de BDD qui les implémente (pas MyISAM donc). Une suppression de groupe 4 dans la table des groupes aurait dû supprimer automatiquement les lignes correspondantes dans la table associative.

    Un petit coup de balai dans les données ne serait pas inutile !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec jointure externe
    Par illight dans le forum Langage SQL
    Réponses: 1
    Dernier message: 09/04/2008, 13h23
  2. Requête avec jointure externe complexe
    Par dpin33 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 04/03/2008, 14h41
  3. optimisation requête avec jointures externes
    Par beurtom dans le forum Oracle
    Réponses: 14
    Dernier message: 16/10/2006, 17h50
  4. requête avec jointure externe
    Par GMI3 dans le forum Oracle
    Réponses: 8
    Dernier message: 12/04/2006, 11h29
  5. Requête avec jointure externe
    Par claralavraie dans le forum Langage SQL
    Réponses: 8
    Dernier message: 02/02/2006, 09h34

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