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

PHP & Base de données Discussion :

left join et clause where [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 28
    Points : 18
    Points
    18
    Par défaut left join et clause where
    bonjour à tous,

    voilà, j'ai un pb avec la clause where et left join dans une interrogation sql :

    1- si j'applique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $requete2="SELECT nom,count(fiche.motif) as total FROM motif left join fiche on motif.nom= fiche.motif group by motif.nom";
    la requete retourne la totalité des 'motif.nom ' y compris ceux qui sont à zéro

    par contre si je fais :

    2-
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $requete2="SELECT nom,count(fiche.motif) as total,date_arrivee  FROM motif left join fiche on motif.nom= fiche.motif where date_arrivee between '$dat1' and '$dat2' group by motif.nom";
    là, seuls les 'motif.nom' de la période apparaissent et pas ceux à zéro

    j'en déduis un 'bug' entre le left join et la clause where mais je n'arrive pa comprendre pourquoi

    si quelqu'un connaît la solution, merci d'avance !

  2. #2
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 222
    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 222
    Points : 28 208
    Points
    28 208
    Par défaut
    ta requête semble à priori fonctionner correctement.

    Une requete externe gauche (Left Join ou Left Outer Join) ramène tous les enregistrements de la table de gauche (ici motif) ainsi que les enregistrements de la table de droite lorsque une correspondance est possible sinon elle rempli les valeurs avec NULL.

    Ta première requette ne fonctionne pas comme tu veux, soit. Que la seconde requette te semble fonctionner mieux vient de la clause Where. TU filtre sur un champ que j'imagine de la table de droite (fiche). Ce champs doit avoir des valeurs précise, ce qui présuppose que dans le résultat de la requette, ce champ est renseigné, et donc qu'un lien ait été trouvé entre la table de gauche et la table de droite, excluant de fait, les enregistrements de Motif qui ne correspondraient à aucun enregistrement de Fiche.

    Pour ne renvoyer que les enregistrements de Motif qui ont une correspondance dans Fiche il faut que tu utilise une jointure Interne (Join ou Inner Join)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    bsr sevyc64,
    merci de ta réponse :
    tout a fait exact, je le comprends bien mais voilà ce que souhaite c'est malgré le filtre que je mets sur la période voulue je puisse avoir tous les motifs, même nuls..(peut-être en inversant la jointure ?)

  4. #4
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 222
    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 222
    Points : 28 208
    Points
    28 208
    Par défaut
    Alors quelque chose du style
    where date_arrivee is null or date_arrivee between '$dat1' and '$dat2'

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    ok j essaies...j'y avais pas pensé !

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    ça fonctionne, merci vraiment beaucoup (hi)
    comme quoi on en apprends tous les jours !
    bon post résolu alors ! ( je pense que ce sont les modérateurs qui le mettent ?)
    amitiés,
    jean-michel

  7. #7
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 222
    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 222
    Points : 28 208
    Points
    28 208
    Par défaut
    non c'est toi, tu as un bouton Resolu sous les posts fat cliquer dessus

  8. #8
    Candidat au Club
    Inscrit en
    Mai 2011
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 5
    Points : 3
    Points
    3
    Par défaut D'la balle !!!
    En effet, je ramais car dès que je rentrais une condition sur la table de "droite" avec un LEFT JOIN, plus de donnée "VIDE" en provenance de la table de "droite".
    Il faut donc doubler avec OR et "IS NULL" toutes les conditions "where" portant sur la table de droite.

    Merci beaucoup. Ca m'enlève une épine du pied.

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

Discussions similaires

  1. Linq avec LEFT JOIN, agrégat et where
    Par Jean-Marc68 dans le forum Linq
    Réponses: 4
    Dernier message: 14/07/2014, 13h30
  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. Nhibernate, Left join, with clause
    Par nono02500 dans le forum NHibernate
    Réponses: 1
    Dernier message: 14/09/2011, 14h30
  5. right join et clause where
    Par ufretin dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/08/2009, 14h40

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