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 :

Jointure externe


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 Jointure externe
    Bonjour à tous,

    J'essaye désespérément de lier 5 tables (joueur, résultats, points, évènement, catégorie de l'évènement).

    Je souhaiterais avoir comme résultat la liste de tous les joueurs (table jos_comprofiler) avec leurs résultats. Je voudrais récupérer le nom des joueurs même s'ils ont participé à aucun évènement.

    Voici ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT firstname , lastname , COALESCE(SUM(points), 0) AS points
    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 
    LEFT OUTER JOIN jos_eventlist_events e ON e.id = r.id_tournoi 
    LEFT OUTER JOIN jos_eventlist_categories cat ON cat.id = e.catsid 
    WHERE cat.id=3 GROUP BY c.id 
    ORDER BY points DESC
    Malgré l'utilisation de LEFT OUTER JOIN sur ma table jos_comprofiler, cela me renvoie uniquement la liste et les points des joueurs ayant participé aux événements.

    Comment puis-je faire pour avoir la liste complète de tous les joueurs?

    Merci par avance.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 878
    Points : 53 055
    Points
    53 055
    Billets dans le blog
    6
    Par défaut
    C'est normal car votre filtre WHERE impose que cat.id soit connu (3 étant différente de NULL).

    Vous devez :
    1) soit faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE cat.id=3 OR cat.id IS NULL
    2) soit faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE COALESCE(cat.id, 3) = 3
    3) soit encore incorporer cette restriction dans la jointure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
           LEFT OUTER JOIN jos_eventlist_categories cat 
                ON cat.id = e.catsid 
                   AND cat.id=3
    Dans tous les cas je me permet de vous signaler que votre GROUP BY est faux !
    Ce devrait être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GROUP BY firstname , lastname
    Donc par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT firstname , lastname , 
           COALESCE(SUM(points), 0) AS points
    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 
           LEFT OUTER JOIN jos_eventlist_events e 
                ON e.id = r.id_tournoi 
           LEFT OUTER JOIN jos_eventlist_categories cat 
                ON cat.id = e.catsid 
                   AND cat.id=3 
    GROUP BY firstname , lastname 
    ORDER BY points DESC
    Bref, apprenez le SQL. mon site web comme mes bouquins sont là pour vous y aider !

    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
    Merci pour votre réponse.
    Cependant les 3 possibilités ne fonctionnent pas....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE cat.id=3 OR cat.id IS NULL
    > Ne me renvoie pas les personnes n'ayant pas de résultats

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE COALESCE(cat.id, 3) = 3
    > Ne me renvoie pas les personnes n'ayant pas de résultats

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    LEFT OUTER JOIN jos_eventlist_categories cat 
        ON cat.id = e.catsid AND cat.id=3
    > Me renvoie toutes les personnes sans appliquer un filtre sur la catégorie de l'évènement

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    569
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2009
    Messages : 569
    Points : 1 046
    Points
    1 046
    Par défaut
    Bonjour,

    Mon cher @SQLPro, tu ne manques jamais une occasion de faire la pub de ton site et tes bouquins.

    Il faut reconnaître, qu'ils m'ont apporté un nombre incalculable de réponses à mes problèmes et que de nombreuses questions posées sur ce forum peuvent être résolues en consultant tes écrits.

    Voilà, un clin d'oeil pour te taquiner et te remercier.

    A+

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 878
    Points : 53 055
    Points
    53 055
    Billets dans le blog
    6
    Par défaut
    Ce que vous voulez est antinomique : vous voulez à la fois une chose et son contraire. Cela n'est logiquement pas possible. Réfléchissez un peu.

    Maintenant en respectant la charte de postage :
    http://www.developpez.net/forums/a69...gage-sql-lire/
    et notamment en donnant :
    1) le script DDL de vos tables
    2) un jeu d'essais ous forme INSERT
    3) le résultat que vous tanndez
    alors ou pourra vous aider !

    A +

  6. #6
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour,

    1) le script DDL de vos tables
    2) un jeu d'essais ous forme INSERT
    3) le résultat que vous tanndez
    Ça m'intéresse aussi tant que je suis chez moi et que je peux tester


  7. #7
    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
    Ce que vous voulez est antinomique : vous voulez à la fois une chose et son contraire. Cela n'est logiquement pas possible. Réfléchissez un peu.
    C'est LOGIQUEMENT PAS POSSIBLE, pourtant vous m'avez apporté 3 façons de résoudre mon problème, qui visiblement ne fonctionnent pas! Il fallait mentionner cet argument avant si c'était si évident que mon besoin était paradoxal !

    J'ai 5 tables correspondant aux joueurs, résultats, points, évènements et catégories des évènements. Je voudrais récupérer en une seule requête le total des points de tous les joueurs pour une catégorie d'évènements (par exemple : championnat d'hiver). Il y a des personnes qui n'ont jamais participé à une catégorie d'évènement mais je veux quand même les récupérer dans ma requête.

    Est-ce possible en une seule requête ?

    Comment faire dans ce cas ? Je pense que tous les éléments nécessaires pour m'aider sont disponibles dans la requête.

    Merci

  8. #8
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Re,

    C'est LOGIQUEMENT PAS POSSIBLE, pourtant vous m'avez apporté 3 façons de résoudre mon problème, qui visiblement ne fonctionnent pas! Il fallait mentionner cet argument avant si c'était si évident que mon besoin était paradoxal !
    Toujours pas moyen d'avoir vos script DDL et un jeu d'essai ???

    Ce n'est pas que je n'ai pas envie de reproduire complètement vos tables et données, mais je ne serais pas forcément exacte avec la réalité !


  9. #9
    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
    Voilà merci beaucoup pour votre aide.
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. [CR9] faire une Jointure externe
    Par coldec dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 28/06/2005, 12h10
  2. Jointure externe compliquée
    Par miniil dans le forum Langage SQL
    Réponses: 9
    Dernier message: 19/02/2004, 09h27
  3. Jointure externe qui ne fonctionne pas
    Par Guizz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/02/2004, 12h26
  4. [ jointure externe ] j'y pompe rien
    Par jaimepasteevy dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/12/2003, 17h57
  5. [Interbase] [Triggers] jointure externe
    Par AnestheziE dans le forum InterBase
    Réponses: 9
    Dernier message: 17/11/2003, 16h17

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