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 :

Besoin d'explication sur LEFT JOIN [MySQL-5.7]


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Par défaut Besoin d'explication sur LEFT JOIN
    Bonjour,
    Je cherche à construire une requête à priori plutôt simple mais je coince sur un point que je ne m'explique pas.

    Voici la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT CONCAT(e.firstname, ' ', e.lastname) employee_name, r.code, r.name, SUM(o.total_products) total FROM ps_region r
    LEFT JOIN ps_address a ON r.code = if(length(r.code) = 2, left(a.postcode,2), LEFT(a.postcode,3))
    LEFT JOIN ps_orders o ON a.id_address = o.id_address_invoice
    LEFT JOIN ps_customer c ON c.id_customer = o.id_customer
    LEFT JOIN ps_employee e ON e.id_employee = r.id_employee
     
    WHERE e.id_employee = 5 
    -- AND (o.date_add BETWEEN '2020-01-31 00:00:00' AND '2020-02-07 23:59:59')  
     
    GROUP BY r.code
    ORDER BY total desc
    Tel quel, la requête me retourne les informations voulues avec les valeurs NULL des Right tables
    Nom : result-ok.jpg
Affichages : 163
Taille : 31,8 Ko

    Si je borne entre 2 dates, la requête ne me retourne pas toutes les informations voulues
    Nom : result-weird.jpg
Affichages : 127
Taille : 15,4 Ko

    Il y a un mécanisme que je n'arrive pas à capter tout seul dans ma grotte.

    Pourquoi ce comportement ?

    Merci de m'aider

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 636
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    C'est tout à fait normal : appliquer une restriction sur une table OUTERtransforme implicitement la jointure en INNER JOIN.

    o.date_add ne peut avoir une valeur comprise entre deux bornes que si o.date_add est "not null" et donc correspondre avec un élément de la table INNER

    Si vous souhaitez conserver une jointure OUTER ajoutez une condition OR o.date_add is null

  3. #3
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 917
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 917
    Par défaut
    Salut ma5t3r.

    Ce comportement est normal !
    Le NULL n'est pas une valeur mais un marquage pour signifier "absence de valeur".
    Si vous avez besoin d'obtenir les colonnes ayant le marquage à NULL, vous devez le préciser explicitement.

    Je ne reprends pas la requête dans son intégralité.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WHERE  e.id_employee = 5
      AND (o.date_add BETWEEN '2020-01-31 00:00:00' AND '2020-02-07 23:59:59'
       OR  o.date_add is NULL)
    Vous aurez votre intervalle mais aussi toutes les date ayant le marquage à NULL.

    @+

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Une autre manière de faire est de ramener la restriction dans la condition de jointure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT CONCAT(e.firstname, ' ', e.lastname) employee_name, r.code, r.name, SUM(o.total_products) total FROM ps_region r
    LEFT JOIN ps_address a ON r.code = if(length(r.code) = 2, left(a.postcode,2), LEFT(a.postcode,3))
    LEFT JOIN ps_orders o ON a.id_address = o.id_address_invoice
       AND (o.date_add BETWEEN '2020-01-31 00:00:00' AND '2020-02-07 23:59:59')  
    LEFT JOIN ps_customer c ON c.id_customer = o.id_customer
    LEFT JOIN ps_employee e ON e.id_employee = r.id_employee
     
    WHERE e.id_employee = 5 
     
    GROUP BY r.code
    ORDER BY total desc
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre chevronné Avatar de ma5t3r
    Homme Profil pro
    Développeur freelance
    Inscrit en
    Mai 2015
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2015
    Messages : 320
    Par défaut
    Bonjour, et merci à vous tous,
    Ces explications me rendent un grand service et apportent la solution que j'attendais.

    Ramener la restriction dans la condition de jointure
    me semble bien répondre à la question de départ.
    Merci beaucoup.

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

Discussions similaires

  1. Besoin d'explications sur les charset
    Par EGPMS dans le forum SQL Procédural
    Réponses: 7
    Dernier message: 03/02/2006, 15h38
  2. [xml] Xpath besoin d'explication sur preceding-sibling::
    Par ekmule dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 10/01/2006, 09h32
  3. besoin d'explication sur le c++
    Par poporiding dans le forum MFC
    Réponses: 13
    Dernier message: 17/12/2005, 18h01
  4. Besoin d'explications sur un bout de code
    Par zizitop dans le forum C
    Réponses: 7
    Dernier message: 26/04/2005, 14h51
  5. Besoin d'explications sur float et l'élasticité !
    Par KneXtasY dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 14/01/2005, 15h15

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