MySQL Multiple Left Joins

J’essaie de créer une page de nouvelles pour un site Web sur lequel je travaille. J’ai décidé d’utiliser les requêtes MySQL correctes (c’est-à-dire COUNT (id) et les jointures au lieu de plusieurs requêtes ou num_rows). J’utilise un wrapper PDO qui devrait fonctionner correctement, et qui échoue quand il est exécuté directement via Application MySQL CLI.

Fondamentalement, j’ai 3 tables. On tient les nouvelles, on tient les commentaires et on tient les utilisateurs. Mon but ici est de créer une page qui affiche tout (paginera plus tard) les titres des articles, les corps, les auteurs et les dates. Cela a bien fonctionné lorsque j’ai utilisé une seconde requête pour obtenir le nom d’utilisateur, mais j’ai ensuite décidé d’utiliser plutôt un JOIN.

Donc quel est le problème? Eh bien, j’ai besoin de deux jointures. L’une consiste à obtenir le nom d’utilisateur de l’auteur et l’autre à obtenir le nombre de commentaires. Quand je vais simplement chercher le nom d’utilisateur de l’auteur, tout fonctionne comme prévu. Toutes les lignes (il y en a 2) dans la table des news sont affichées. Cependant, lorsque j’ai ajouté cette seconde LEFT JOIN pour la ligne de commentaires, je finis par ne recevoir qu’une ligne de news (rappelez-vous, il y en a 2) et COUNT (comments.id) me donne 2 (il devrait afficher 1 comme un commentaire pour chaque article.)

Qu’est-ce que je fais mal? Pourquoi affiche-t-on un seul article et dit-il qu’il a deux commentaires, alors qu’il ya deux articles, chacun avec un commentaire?

SELECT news.id, users.username, news.title, news.date, news.body, COUNT(comments.id) FROM news LEFT JOIN users ON news.user_id = users.id LEFT JOIN comments ON comments.news_id = news.id 

Aussi, juste pour être sûr d’une autre chose, ma jointure à gauche aux commentaires est la bonne façon d’obtenir tous les messages, qu’ils aient des commentaires ou non, correct? Ou serait-ce une jointure droite? Oh, une dernière chose … si je passe comments.news_id = news.id à news.id = comments.news_id, j’obtiens 0 résultats.

Vous manquez une clause GROUP BY:

 SELECT news.id, users.username, news.title, news.date, news.body, COUNT(comments.id) FROM news LEFT JOIN users ON news.user_id = users.id LEFT JOIN comments ON comments.news_id = news.id GROUP BY news.id 

La jointure gauche est correcte. Si vous avez utilisé un INNER ou un RIGHT JOIN, vous n’obtiendrez pas de nouvelles sans commentaires.

Pour afficher tous les détails pour chaque titre de poste de nouvelles, c.-à-d. “news.id” qui est la clé primaire, vous devez utiliser la clause GROUP BY pour “news.id”

 SELECT news.id, users.username, news.title, news.date, news.body, COUNT(comments.id) FROM news LEFT JOIN users ON news.user_id = users.id LEFT JOIN comments ON comments.news_id = news.id GROUP BY news.id 

Pour afficher tous les détails pour chaque titre de poste de nouvelles, c.-à-d. “news.id”, qui est la clé primaire, vous devez utiliser la clause GROUP BY pour “news.id”

 SELECT news.id, users.username, news.title, news.date, news.body, COUNT(comments.id) FROM news LEFT JOIN users ON news.user_id = users.id LEFT JOIN comments ON comments.news_id = news.id GROUP BY news.id