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

  1. #1
    Membre confirmé
    Peut-on avoir plusieurs conditions dans le ON après un LEFT JOIN ?
    bonjour,

    à ma grande surpise, les multiples conditions (en gras) dans le ON après un LEFT JOIN ne sont pas interprétées ou ne fonctionnent pas. Seule ma première (soulignée) est utilisée. j'ai ajouté plusieurs AND pour restrainde les données de la jointures (restraindre le coût de la requete serveur).


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Customers.CustomerName, Orders.OrderID
    FROM Customers
    LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID AND Orders.Supprimee=0 AND Orders.archivee=0
    ORDER BY Customers.CustomerName;


    pour que mes critères supplémentaires soient utilisées, je dois les mettre en WHERE à la fin visiblement:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT Customers.CustomerName, Orders.OrderID
    FROM Customers
    LEFT JOIN Orders ON Customers.CustomerID = Orders.CustomerID 
    WHERE Orders.Supprimee=0 AND Orders.archivee=0
    ORDER BY Customers.CustomerName;


    Et pourtant cette syntaxe ne produit pas de messages d'erreur même si inutile. est-ce une faute de ma part ou une issue de mysql ?

  2. #2
    Membre éclairé
    Bonjour,

    Oui tu peux avoir plusieurs conditions dans la clause ON d'une jointure externe, et c'est d'ailleurs important si tu souhaites conserver la jointure externe, car déplacer les critères dans la clause WHERE n'aura pas le même effet. Je ne connais pas MySQL mais j'ai cru comprendre que c'est un produit bien bugué, à faire confirmer par des utilisateurs de MySQL.

  3. #3
    Modérateur

    Comme je l'explique dans mon blog, c'est bien la première requête qu'il faut faire si tu ne veux pas transformer de facto ton LEFT JOIN en INNER JOIN.

    Quel est le symptôme qui te fait dire qu'elle ne fonctionne pas ?

    Peut-on avoir un jeu de données significatif et le résultat obtenu ?

    EDIT :
    Je viens de faire le test et il me semble que ça fonctionne :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT INTO Customers (CustomerName)
    VALUES ('Dupont'), ('Durand'), ('Duparc');
     
    INSERT INTO Orders (CustomerId, Supprimee, archivee)
    VALUES (1, 0, 0), (1, 1, 0), (2, 0, 0), (1, 1, 1);


    Résultat de la première requête :
    CustomerName OrderID
    Duparc NULL
    Dupont 1
    Durand 3
    => Les 3 clients apparaissent puisque c'est une jointure externe.
    => Les deux seules lignes répondant à la condition sont là et pas les autres.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Modérateur

    Bonjour

    Si cela fonctionne, mais c'est peut être son comportement que vous avez mal appréhendé : avec la condition dans la jointure externe, la ligne ressortira dans tous les cas.
    Si les conditions de jointure sont remplies, alors vous aurez des données dans les colonnes de la table de gauche,
    Si les conditions de jointure ne sont pas remplies, alors vous aurez tout de même la ligne, avec toutes les colonnes de la table de gauche à NULL


    Donc, tout dépend de de ce que vous voulez obtenir... une petite explication du résultat attendu serait la bienvenue !

  5. #5
    Modérateur

    Il est tout-à-fait possible que ce soit un bug de MySQL car j'ai eu le même problème pas plus tard que la semaine dernière, avec un produit fonctionnant avec une version « relativement » ancienne de MySQL (quelques années). J'ai fini par être contraint de mettre ça dans le WHERE également pour livrer car d'autres bugs plus critiques m'attendaient et j'ai donc mis ça sur la TODO list des trucs à vérifier et à reprendre.

    J'aimerais bien le valider officiellement et pouvoir affirmer de manière déterministe si c'est un bug ou si c'est un cas particulier géré différemment selon les plateformes, mais je n'ai malheureusement pas le temps de faire cette validation maintenant.

    Donc le premier qui le fera aura toute notre estime. ;-)

###raw>template_hook.ano_emploi###