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 :

Problème left outer join et group by


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 17
    Points : 9
    Points
    9
    Par défaut Problème left outer join et group by
    Bonjour à tous,

    Je travaille sur un site de poker, et j'ai créé une requête qui récupère les joueurs les résultats les points etc ... afin de générer un classement général.

    Voici ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT firstname , lastname , COALESCE(SUM(points), 0) + (COUNT(r.id_joueur) * 10) AS points , COUNT(r.id_joueur) AS nb_tournoi , COUNT(CASE WHEN r.position < 9 THEN 1 ELSE NULL END) AS nbfinaletable , COUNT(CASE WHEN r.position = 1 THEN 1 ELSE NULL END) AS nbvictoire , MIN(r.position) AS meilleure_pos , MAX(r.position) AS mauvaise_pos 
     
    FROM jos_comprofiler c 
    LEFT OUTER JOIN jos_tournament_results r ON c.id = r.id_joueur 
    LEFT OUTER JOIN jos_tournament_points p ON r.position = p.position 
    INNER JOIN jos_eventlist_events e ON e.id = r.id_tournoi 
    INNER JOIN jos_eventlist_categories cat ON cat.id = e.catsid 
     
     
    GROUP BY c.id 
     
    ORDER BY points DESC , nb_tournoi DESC , nbfinaletable DESC , meilleure_pos
    La table comprofiler est la table des joueurs.
    La table tournament_results est la table des résultats.
    La table tournament_points est la grille de points attribués.
    La table jos_eventlist_events est la table des tournois et jos_eventlist_categories la table des catégories des tournois.

    Je fais un GROUP BY par id_joueur car je fais le total des points du joueur.

    Voilà, tout fonctionne très bien mise à part une seule chose.
    Les joueurs n'ayant jamais participé à un tournoi (qui existe dans la table joueurs "comprofiler" mais pas dans la table résultats "tournament_results") n'apparait pas dans mon classement général.

    Je pensais que LEFT OUTER JOIN servait à ça. C'est peut être l'association de LEFT OUTER JOIN avec GROUP BY qui pose problème.

    Pour avoir une petite idée, le classement général est disponible à cette adresse.

    Le classement comporte 60 entrées, or le club de poker comporte 70 personnes, 10 personnes ayant raté les premiers tournois.

    Pouvez-vous m'aider svp ?

    Merci par avance.

  2. #2
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 218
    Points : 28 169
    Points
    28 169
    Par défaut
    JE pense que ton problème vient de tes 2 jointures internes. Elles sont faite avec une table qui est, elle-même en jointure externe gauche.

    Le problème est, je pense, que tes jointures internes transforme la première jointure externe gauche en jointure interne elle aussi.

    Essaye ta requete en mettant que des left outer join.






    PS : J'espère ne pas dire de bêtises sur ces jointures mais c'est un phénomène que j'ai rencontré et que j'ai analysé comme ça.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    J'avais déjà essayé mais ça renvoi le même résultat.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    Pas d'autres idées ?

  5. #5
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 218
    Points : 28 169
    Points
    28 169
    Par défaut
    Je n'ai pas de jeu de données pour faire quelques tests, mais pour moi avec des LEFT OUTER JOIN tes requetes me semblent correctes.


    Par contre j'ai quand même un doute sur la clause GROUP BY, pour moi elle devrait contenir non pas l'id, mais les champs du SELECT qui ne sont pas dans une agrégation, c'est à dire firstname et lastname

Discussions similaires

  1. Problème Left outer join et Ria (ou Edmx?)
    Par Golzinne dans le forum Silverlight
    Réponses: 2
    Dernier message: 06/09/2011, 14h35
  2. [Oracle9i] problème left outer join
    Par Minimin dans le forum Langage SQL
    Réponses: 6
    Dernier message: 02/06/2009, 11h06
  3. left outer join et group by
    Par pobrouwers dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/11/2007, 13h58
  4. probléme left outer join
    Par biba158 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 17/07/2007, 12h29
  5. Problème de performance avec LEFT OUTER JOIN
    Par jgfa9 dans le forum Requêtes
    Réponses: 6
    Dernier message: 17/07/2005, 13h17

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