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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    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
    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 : 42
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    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
    Membre éprouvé
    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
    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 : 42
    Localisation : France

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

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

  5. #5
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    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
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  6. #6
    Membre éprouvé
    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
    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 éprouvé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 77
    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
    Membre éprouvé
    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
    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
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    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 !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

+ 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, 12h23
  2. Requête avec jointure externe complexe
    Par dpin33 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 04/03/2008, 13h41
  3. optimisation requête avec jointures externes
    Par beurtom dans le forum Oracle
    Réponses: 14
    Dernier message: 16/10/2006, 16h50
  4. requête avec jointure externe
    Par GMI3 dans le forum Oracle
    Réponses: 8
    Dernier message: 12/04/2006, 10h29
  5. Requête avec jointure externe
    Par claralavraie dans le forum Langage SQL
    Réponses: 8
    Dernier message: 02/02/2006, 08h34

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