2 votes

SQL renvoie la table gauche en l'absence de relation de jointure

J'ai la requête suivante qui renvoie les données du post/article et les commentaires s'ils sont associés. Cependant, si aucun commentaire n'a été fait pour un article, rien n'est renvoyé, pas même l'article, car (je pense) il n'y a pas de relation de jointure dans la table des commentaires. S'il n'y a pas de commentaires, aucune ligne n'est créée avec l'ID de l'article.

Quelqu'un peut-il m'expliquer comment obtenir les données de l'article et tous les commentaires associés en une seule requête ?

Voici la requête : -

        SELECT * FROM posts
                LEFT OUTER JOIN comments
                ON posts.ID = comments.comment_post_id
            WHERE posts.ID = 8 
                AND posts.post_type = 'post' 
                AND posts.post_status = 'publish'
                AND comments.comment_approved = 1
            ORDER BY comments.comment_date_gmt DESC

4voto

Alex Siri Points 2707

Le problème que vous rencontrez est que, même si les tables sont jointes à gauche, vous filtrez en fonction de cela dans la clause where :

                AND comments.comment_approved = 1

Pour que cela fonctionne, une option serait de le faire :

 SELECT * FROM posts
            LEFT OUTER JOIN comments
            ON posts.ID = comments.comment_post_id
            AND comments.comment_approved = 1
        WHERE posts.ID = 8 
            AND posts.post_type = 'post' 
            AND posts.post_status = 'publish'
        ORDER BY comments.comment_date_gmt DESC

ou un autre

 SELECT * FROM posts
            LEFT OUTER JOIN comments
            ON posts.ID = comments.comment_post_id
        WHERE posts.ID = 8 
            AND posts.post_type = 'post' 
            AND posts.post_status = 'publish'
            AND (comments.comment_approved IS NULL OR comments.comment_approved = 1)
        ORDER BY comments.comment_date_gmt DESC

2voto

Hamlet Hakobyan Points 19023

Parce que vous avez LEFT OUTER JOIN vous obtiendrez tous les éléments du tableau de gauche et les lignes associées de droite ou de gauche. NULL s'il n'y en a pas. Sur le WHERE clause vous avez un prédicat comments.comment_approved = 1 qui false quand comments.comment_approved es NULL (non associé).

Déplacer AND comments.comment_approved = 1 à la condition JOIN.

0voto

Charles Bretana Points 59899

Il est important de comprendre comment le processeur de requêtes fonctionne pour les jointures externes (gauche/droite/complète) et les clauses "where".

Pour chaque jointure, le processeur de requêtes crée un ensemble de résultats temporaire (une table) contenant les résultats de la jointure. Les données de la nouvelle table sont combinées avec ce que contient l'ensemble de résultats temporaire actuel, les données de la première table mentionnée dans la clause From ou l'ensemble de résultats de la jointure précédente (s'il y en a eu une).

Cet ensemble de résultats est filtré sur la base des prédicats (conditions) exprimés dans la clause Joins ON, qui sont traités dans le cadre de ce processus de construction. Les conditions sur le côté extérieur de la jointure, bien sûr, ne s'appliquent que lorsqu'il y a une ligne à cet endroit. S'il n'y a pas de ligne correspondante, la ligne correspondante du côté intérieur est incluse de toute façon, et des zéros sont substitués à toutes les colonnes du côté extérieur.

Ensuite, et c'est la partie critique, lorsque toutes les jointures sont terminées et que l'on arrive à la clause Where, les conditions sont appliquées à l'ensemble de résultats généré par toutes les jointures, quelle que soit la façon dont l'ensemble de résultats a été construit (interne/externe, croisé, etc.). Ainsi, si vous avez une condition sur une colonne de cet ensemble de résultats qui provient d'une table située du côté extérieur d'une jointure, qui contient des zéros parce que cette jointure n'avait pas de ligne correspondante dans la table extérieure, cette ligne sera exclue par la condition de la clause Where.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X