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 :

right join et clause where


Sujet :

Langage SQL

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 25
    Par défaut right join et clause where
    Bonjour,

    Je rencontre actuellement un problème de syntaxe sur l'une de mes instructions SQL (je travaille sur MySQL même si peu importe certainement).

    Le but de ma requête est de récupérer le nombre d'objets par département dont le type objet est X et la région Y, tout en récupérant également la liste complète des département de la région. Ainsi, je devrais récupérer la liste complète des régions de ce département avec une ligne nb_objets valant le nombre d' objet correspondant à ce que retourne la clause WHERE.

    La requête que je traite est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT departement.id_departement,departement.nom, COUNT(objet.id_objet) as nb_objet
    FROM objet
    JOIN objet_commune ON objet.id_objet = objet_commune.id_objet
    JOIN commune ON commune.id_commune = objet_commune.id_commune
    RIGHT JOIN departement ON commune.id_departement = departement.id_departement
    WHERE id_region= :id_region
    AND objet.id_type_objet = :id_type_objet
    GROUP BY departement.id_departement
    Cette requête ne me retourne actuellement aucun résultat.

    Pourtant si j'effectue la même requête en retirant la clause "AND objet.id_type_objet = :id_type_objet" je récupère bien la liste que j'attend décrite plus haut.
    Je comprendrais que le résultat retourner soit une liste de mes départements avec tout les nb_objet valant 0 (dans la mesure où aucun ne correspond à ma clause WHERE), mais je m'attend tout de même à récupérer cette liste, ce qui n'est pas le cas (je ne récupère aucun enregistrement).

    Merci d'avance pour vos explications, j'aimerais éviter de passer par deux requête SQl imbriqué, et j'aimerais également comprendre pourquoi ma requête se comporte ainsi.

  2. #2
    Membre chevronné Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Par défaut
    Bonjour,

    Si je schématise :
    Vous voulez faire une jointure externe sur departement, et c'est bien ce que vous faites dans la clause from.
    Mais dans la clause where, l'égalité sur la colonne "id_region" de cette même table fait que cette colonne DOIT exister (pour être comparer c'est la moindre des choses), donc votre jointure externe n'est plus.

    Pour expliquer plus techniquement, le résultat de votre jointure externe ramène des lignes avec des id_region "null". "null" est un marqueur, qui n'est égal à rien, et qui n'est différent de rien ==> votre égalité enlève donc ces lignes du résultat.

    Une solution, qui doit fonctionner en mysql, est de passer cette égalité dans le from :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
    RIGHT JOIN departement ON commune.id_departement = departement.id_departement and id_region= :id_region
    WHERE 
    ...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 25
    Par défaut
    Merci beaucoup,
    Mon problème venait en effet de la clause WHERE qui mettait une restriction sur ma table de région portant sur id_type_objet (qui n'existe pas dans cette table)
    Une légère adaptation de votre code m'a permis de résoudre le problème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT departement.id_departement,departement.nom, COUNT(objet.id_objet) AS nb_objet
    FROM objet
    JOIN objet_commune ON objet.id_objet = objet_commune.id_objet AND objet.id_type_objet = :id_type_objet
    JOIN commune ON commune.id_commune = objet_commune.id_commune
    RIGHT JOIN departement ON commune.id_departement = departement.id_departement
    WHERE id_region= :id_region
    GROUP BY departement.id_departement
    Ce code me renvoie bien ce que j'attendais. merci pour cette explication sur cette petite subtilité du JOIN que je ne connaissais point

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

Discussions similaires

  1. [MySQL] left join et clause where
    Par jeanmichel.lovichi dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 18/10/2013, 14h57
  2. [AC-2007] Equivalent Left Join dans Clause Where
    Par kornetmuse dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 07/03/2013, 16h31
  3. LEFT JOIN AVEC CLAUSE WHERE
    Par przvl dans le forum Requêtes
    Réponses: 2
    Dernier message: 23/03/2012, 10h14
  4. Une clause WHERE avant un LEFT JOIN ?
    Par bugalood dans le forum Langage SQL
    Réponses: 11
    Dernier message: 27/07/2005, 14h22
  5. INNER JOIN ... ON ... ou jointure dans clause where
    Par schmur1 dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 28/06/2005, 09h16

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