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 :

Utilisation de LEFT JOIN


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 931
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 931
    Par défaut Utilisation de LEFT JOIN
    Bonjour,

    Le description de mon problème est assez simple. J'ai une table avec chaque jour de l'année au format DATE.

    J'ai des enregistrements dans une autre table, mais qui n'ont pas lieu tous les jours.

    J'aimerais, par liaison entre les deux tables, afficher l'ensemble des jours, même s'il n'y a pas d'enregistrement correspondant à cette date dans la deuxième table.

    Exemples de données :

    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Table `date` :
    
         `jour`
    ----------------
           ...
       2009-01-01
       2009-01-02
       2009-01-03
       2009-01-04
       2009-01-05
           ...
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Table `event` :
    
     `id`       `date`
    -----------------------
       1      2009-01-01
       2      2009-01-04
    J'aimerais donc, pour l'enregistrement 1, afficher quelque chose de similaire à :

    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
         `jour`      `id`       `date`
    ---------------------------------------
       2009-01-01      1      2009-01-01
       2009-01-02     NULL     NULL
       2009-01-03     NULL     NULL
       2009-01-04     NULL     NULL
       2009-01-05     NULL     NULL

    J'ai essayé de plusieurs manières :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT
       *
    FROM
       `date` d LEFT JOIN `event` e ON d.`jour` = e.`date`
    WHERE
       d.`jour` BETWEEN "2009-01-01" AND "2009-01-05"
       AND e.`id` = 1
    Ce qui me ressortait évidemment qu'une seule ligne. J'ai donc rajouté un IS NULL sur l'id :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT
       *
    FROM
       `date` d LEFT JOIN `event` e ON d.`jour` = e.`date`
    WHERE
       d.`jour` BETWEEN "2009-01-01" AND "2009-01-05"
       AND ( e.`id` = 1 OR e.`id` IS NULL )
    Sauf que du coup, je n'ai pas la ligne vide correspondant au 2009-01-04.

    Après plusieurs tentatives infructueuses je suis arrivé à ça qui fonctionne très bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT
       *
    FROM
       `date` d LEFT JOIN `event` e ON d.`jour` = e.`date`
       AND e.`id` = 1
    WHERE
       d.`jour` BETWEEN "2009-01-01" AND "2009-01-05"
    Mais est-ce une technique très utilisée de mettre des AND dans le FROM ?

    Ici mon exemple est simplifié, mais j'ai 5 ou 6 conditions relatives à ma table event, donc dois-je toutes les mettre dans le FROM également ?


  2. #2
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Saluton,
    Citation Envoyé par Bisûnûrs Voir le message
    Ici mon exemple est simplifié, mais j'ai 5 ou 6 conditions relatives à ma table event, donc dois-je toutes les mettre dans le FROM également ?
    C'est bien là le problème, si la jointure se fait sur les dates et qu'après la clause WHERE filtre sur d'autres colonnes, lorsque la jointure n'opère pas ce sont toutes les autres colonnes de la table `event` qui sont NULL, pas seulement l'id.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  3. #3
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 931
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 931
    Par défaut
    Citation Envoyé par Maljuna Kris Voir le message
    si la jointure se fait sur les dates et qu'après la clause WHERE filtre sur d'autres colonnes, lorsque la jointure n'opère pas ce sont toutes les autres colonnes de la table `event` qui sont NULL, pas seulement l'id.
    Dit comme ça, ça prend tout son sens.

    Merci à vous deux !

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 293
    Par défaut
    Salut Bisûnûrs !

    C'est effectivement la solution, et oui, c'est logique et assez utilisé.

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

Discussions similaires

  1. [MySQL-5.1] Utilisation de LEFT JOIN
    Par Jon Shannow dans le forum Requêtes
    Réponses: 1
    Dernier message: 14/11/2014, 10h47
  2. utilisation LEFt JOIN ds une trigger DELETE
    Par moukit233 dans le forum Requêtes
    Réponses: 1
    Dernier message: 15/04/2010, 18h48
  3. Utilisation du LEFT JOIN
    Par Mobistar dans le forum Langage SQL
    Réponses: 1
    Dernier message: 01/09/2008, 22h56
  4. [MySQL 4.0.17] utilisation de LEFT JOIN 2 fois
    Par Zen_Fou dans le forum Administration
    Réponses: 4
    Dernier message: 26/04/2006, 13h55
  5. LEFT JOIN avec Oracle 8i ne va pas... doit utiliser (+)
    Par loikiloik dans le forum Langage SQL
    Réponses: 10
    Dernier message: 21/04/2004, 16h38

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