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 :

Jointure de tables et count


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 139
    Points : 50
    Points
    50
    Par défaut Jointure de tables et count
    Bonjour,

    J'ai un problème dans une requête avec jointure entre deux tables. Les lignes dont le résultat de count est NULL ne sont pas retournées...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT 	T1.id,
    			T1.login,
    			T1.nom,
    			T1.prenom,
    			T1.password,
    			T1.dateinscr,
    			T1.status,
    			T1.groupname,
    			count(T2.id) AS nb
    FROM 	users 	T1
    INNER JOIN files T2 			ON T1.id		= T2.user
    GROUP BY user
    ORDER BY T1.login ASC;
    Une idée ?

    Merci d'avance, Guillaume.

  2. #2
    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
    Si j'interprète correctement ta requête, tu cherches à compter les 'files' pour chaque 'users' ?

    Alors fais le GROUP BY sur T1.id plutôt que sur user qui semble venir de T2. En groupant par T2 tu groupes par file donc ton comptage sera toujours de 1 ; pas très utile !

    Ensuite, il est inutile de compter les T2.id. Un simple COUNT(*) est suffisant et peut être plus rapide. En effet, la jointure va donner quelque chose de ce genre :
    T1.id / T2.id
    1 / 1
    1 / 2
    2 / 3
    3 / 3
    4 / 2
    4 / 3
    4 / 5
    ...
    COUNT(*), associé au GROUP BY T1.id, va dire au SGBD de compter le nombre de lignes de chaque T1.id, peu importe ce que contiennent ces lignes.
    Alors que COUNT(T2.id) va lui demander de compter spécifiquement les T2.id, ce qui peut lui prendre plus de temps.

    Enfin, les autres colonnes de T1 qui ne figurent pas dans le GROUP BY devraient te donner un résultat cohérent car toutes se rapportent au même user mais dans l'absolu, ce n'est pas forcément vrai alors c'est une bonne habitude de mettre dans le GROUP BY toutes les colonnes ne faisant pas l'objet de calcul.

    Par contre je ne suis pas sûr de comprendre ton problème :
    Les lignes dont le résultat de count est NULL ne sont pas retournées...
    Un COUNT ne donnera jamais NULL mais au minimum 0.
    J'ai l'impression que tu veux dire que les users n'ayant pas de file ne sont pas retournés. En ce cas c'est logique puisque ta jointure est une jointure interne (INNER) qui ne donne que les lignes en correspondance. Si tu veux tous les users il faut utiliser la jointure externe LEFT OUTER ou RIGHT OUTER selon la position de la table dont tu veux garder toutes les lignes.

    Ta requête deviendrait donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT     T1.id,
      T1.login,
      T1.nom,
      T1.prenom,
      T1.password,
      T1.dateinscr,
      T1.STATUS,
      T1.groupname,
      COUNT(*) AS nb
    FROM users T1
    LEFT OUTER JOIN files T2 ON T1.id = T2.user
    GROUP BY T1.id
    ORDER BY T1.login ASC;
    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 !

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 139
    Points : 50
    Points
    50
    Par défaut
    Oui, c'est exactement ce que je voulais...

    Merci beaucoup CinePhil !

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

Discussions similaires

  1. un count different jointure 2 tables
    Par Jarod51 dans le forum Requêtes
    Réponses: 5
    Dernier message: 02/01/2012, 16h15
  2. Jointure de table avec Interbase
    Par ada_b dans le forum InterBase
    Réponses: 21
    Dernier message: 12/05/2010, 19h52
  3. Réponses: 3
    Dernier message: 08/11/2006, 23h04
  4. jointure sur table et procedure stocké
    Par pram dans le forum SQL
    Réponses: 3
    Dernier message: 18/11/2004, 21h56
  5. requete(jointure 2 tables) qui marche pas
    Par DaxTaz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/06/2004, 17h50

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