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

Requêtes MySQL Discussion :

COUNT et multi jointures


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2011
    Messages : 146
    Par défaut COUNT et multi jointures
    Bonjour à tous.

    Je possède 5 tables. Les voici :

    Createur :
    id_createur
    nom_createur

    GroupeObjets :
    id_groupe
    nom_groupe
    id_createur

    Objet :
    id_objet
    nom_objet
    id_groupe

    TypeGroupe :
    id_type
    nom_type

    GroupesType :
    id_groupestype
    id_groupe
    id_type

    J'ai mis un fichier .sql en picède jointe qui génère ces tables et les peuple très brièvement pour pouvoir tester la requête.

    J'ai fait une première requête qui consiste à récupérer tous les groupes d'objets, ainsi que leur créateur et le nombre d'objets qu'ils possèdent. La voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT GroupeObjets.id_groupe, GroupeObjets.nom_groupe, Createur.nom_createur, COUNT(Objet.id_objet) AS nb_objets
    FROM Createur, GroupeObjets, Objet
    WHERE GroupeObjets.id_createur = Createur.id_createur AND GroupeObjets.id_groupe = Objet.id_groupe
    GROUP BY GroupeObjets.id_groupe, GroupeObjets.nom_groupe
    Cette requête fonctionne chez moi.

    Maintenant, je voudrais récupérer la même chose, c'est-à-dire tous les groupes d'objets, ainsi que leur créateur et le nombre d'objets qu'ils possèdent, MAIS en ajoutant une condition sur les types de groupe. C'est à dire la même requête que tout à l'heure mais seulement pour les groupes appartenant au "type 1" et au "type 2" par exemple.

    Voilà ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT GroupeObjets.id_groupe, GroupeObjets.nom_groupe, Createur.nom_createur, COUNT(Objet.id_objet) AS nb_objets
    FROM Createur, GroupeObjets, Objet, GroupesType
    WHERE GroupeObjets.id_createur = Createur.id_createur AND GroupeObjets.id_groupe = Objet.id_groupe AND GroupeObjets.id_groupe = GroupesType.id_groupe AND GroupesType.id_type IN ("1", "2")
    GROUP BY GroupeObjets.id_groupe, GroupeObjets.nom_groupe
    Mais ça ne fonctionne pas..

    En espérant trouver de l'aide. Merci beaucoup d'avance à vous
    Fichiers attachés Fichiers attachés

  2. #2
    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
    1) Les jointures s'écrivent depuis 20 ans avec l'opérateur JOIN ; il serait temps de s'y mettre !

    2) Toutes les colonnes du SELECT ne faisant pas l'objet d'une fonction de groupage doivent figurer dans le GROUP BY sous peine de voir des valeurs aléatoires pour les colonnes manquantes.
    Tu as donc de la chance si ta première requête donne à chaque fois le résultat juste car le créateur est aléatoire !

    3) L'utilisation d'alias pour les tables est fortement recommandé dès qu'il y a plus d'une table dans la requête. Cela facilite l'écriture et la lecture de celle-ci. Il faut ensuite utiliser systématiquement ces alias devant chaque colonne nommée pour savoir facilement de quelle table elle vient.

    4) Si un GroupeObjets n'a pas d'objet associé, ta requête ne te le dira pas. Il faut utiliser une jointure externe pour avoir tous les GroupesObjets.

    Ta première requête devrait plutôt être celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT go.id_groupe, go.nom_groupe,
    	c.nom_createur,
    	COUNT(o.id_objet) AS nb_objets
    FROM GroupeObjets go
    INNER JOIN Createur c ON c.id_createur = go.id_createur
    LEFT OUTER JOIN Objet o ON o.id_groupe = go.id_groupe
    GROUP BY go.id_groupe, go.nom_groupe, c.nom_createur
    Maintenant, je voudrais récupérer la même chose, c'est-à-dire tous les groupes d'objets, ainsi que leur créateur et le nombre d'objets qu'ils possèdent, MAIS en ajoutant une condition sur les types de groupe. C'est à dire la même requête que tout à l'heure mais seulement pour les groupes appartenant au "type 1" et au "type 2" par exemple.
    5) Inutile d'entourer les valeurs numériques avec des apostrophes !

    Cette requête devrait répondre à ton besoin (pas testé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT go.id_groupe, go.nom_groupe,
    	c.nom_createur,
    	COUNT(o.id_objet) AS nb_objets
    FROM GroupeObjets go
    INNER JOIN Createur c ON c.id_createur = go.id_createur
    INNER JOIN GroupesType gt ON gt.id_groupe = go.id_groupe
    LEFT OUTER JOIN Objet o ON o.id_groupe = go.id_groupe
    WHERE gt.id_type IN (1, 2)
    GROUP BY go.id_groupe, go.nom_groupe, c.nom_createur
    Je ne vois d'ailleurs pourquoi ta seconde requête ne fonctionnait pas, malgré mes remarques précédentes. Qu'est-ce qui "ne fonctionne pas" ?
    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 !

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2011
    Messages : 146
    Par défaut
    4) Si un GroupeObjets n'a pas d'objet associé, ta requête ne te le dira pas. Il faut utiliser une jointure externe pour avoir tous les GroupesObjets.
    Je veux seulement récupérer les groupes ayant au moins un objet. De plus, avec ta requête, les groupes n'ayant pas d'objets ne s'affichent pas non plus (ce n'est pas ce que je désire, mais je crois que c'est ce qu'était censée faire ta requête non ?)

    Je ne vois d'ailleurs pourquoi ta seconde requête ne fonctionnait pas, malgré mes remarques précédentes. Qu'est-ce qui "ne fonctionne pas" ?
    Et bien ma seconde requête ne fonctionne pas, elle me renvoie un nombre d'objets trop important par groupe. Idem avec ta requête

  4. #4
    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
    De plus, avec ta requête, les groupes n'ayant pas d'objets ne s'affichent pas non plus (ce n'est pas ce que je désire, mais je crois que c'est ce qu'était censée faire ta requête non ?)
    Intrigué par ce phénomène, j'ai téléchargé ton fichier SQL et l'ai chargé chez moi.
    La raison est que les id des créateurs vont de 0 à 2 alors que le groupe 2 référence l'id_createur 3 !
    En incrémentant les id_createur à partir de 1 comme il est d'usage, ma requête donne bien le groupe 2 avec 0 objet.
    Si tu avais implémenté les contraintes de clés étrangères, tu aurais eu des données plus justes pour tes tests.

    elle me renvoie un nombre d'objets trop important par groupe
    OK. C'est par qu'un groupe peut être de plusieurs types.

    Utilise COUNT(DISTINCT o.id_objet)
    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 !

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2011
    Messages : 146
    Par défaut
    Ca marche parfaitement.

    Je te remercie beaucoup pour ton aide et tous tes conseils.

    A très bientôt

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2011
    Messages : 146
    Par défaut
    Une dernière chose :

    Je remplace donc les LEFT OUTER JOIN par des INNER JOIN pour n'obtenir que les groupes qui possèdent des objets c'est bien ça ?

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

Discussions similaires

  1. COUNT dans une jointure
    Par picsoun dans le forum Langage SQL
    Réponses: 4
    Dernier message: 03/04/2006, 20h27
  2. Problème Requete Multi Jointure + Like
    Par thefutureisnow dans le forum Langage SQL
    Réponses: 27
    Dernier message: 06/01/2006, 15h50
  3. Problème Requete Multi Jointure + Like
    Par thefutureisnow dans le forum Requêtes
    Réponses: 3
    Dernier message: 02/01/2006, 19h39
  4. [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
  5. un count sur une jointure et ca ne fonctionne pas
    Par elbronziero dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/10/2004, 11h23

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