MySQL Multiple Left Joins

Ik probeer een nieuwspagina te maken voor een website waaraan ik werk. Ik heb besloten dat ik de juiste MySQL-query’s wil gebruiken (wat betekent COUNT (id) en joins in plaats van meer dan één query of num_rows.) Ik gebruik een PDO-wrapper, die goed zou moeten werken, en dit mislukt nog steeds wanneer het rechtstreeks via de MySQL CLI-toepassing.

In principe heb ik 3 tabellen. De een houdt het nieuws vast, de ander de commentaren en de ander de gebruikers. Mijn doel hier is om een ​​pagina te maken die alle (later zal pagineren) de titels, hoofdteksten, auteurs en datums van nieuwsberichten weergeeft. Dit werkte prima toen ik een tweede zoekopdracht gebruikte om de gebruikersnaam te krijgen, maar toen besloot ik dat ik liever een JOIN zou gebruiken.

Dus wat is het probleem? Ik heb twee joins nodig. De ene is om de gebruikersnaam van de auteur te krijgen en de andere om het aantal opmerkingen te krijgen. Als ik gewoon voor de gebruikersnaam van de auteur ga, werkt alles zoals verwacht. Alle rijen (er zijn er 2) in de nieuwstabel worden weergegeven. Toen ik echter deze tweede LEFT JOIN voor de opmerkingenrij toevoegde, ontvang ik uiteindelijk slechts één rij van nieuws (onthoud dat er 2 zijn) en COUNT (comments.id) geeft me 2 (het zou 1 moeten weergeven zoals ik heb gedaan een opmerking voor elk bericht.)

Wat doe ik verkeerd? Waarom geeft het maar één nieuwsbericht weer en zegt het dat het twee opmerkingen heeft, terwijl er twee nieuwsberichten zijn, elk met één opmerking?

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

Ook, om nog iets zeker te weten, mijn linkerdeelname aan reacties is de juiste manier om alle berichten te krijgen, ongeacht of ze al dan niet commentaar hebben, correct? Of zou dat een juiste join zijn? Oh, nog een laatste ding… als ik comments.news_id = news.id naar news.id = comments.news_id verander, krijg ik 0 resultaten.


Antwoord 1, autoriteit 100%

Je mist een GROUP BY-clausule:

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

De linkerjoin is correct. Als je een INNER of RIGHT JOIN gebruikte, zou je geen nieuwsitems krijgen zonder commentaar.


Antwoord 2, autoriteit 6%

Om alle details voor elke nieuwsberichttitel weer te geven, bijv. “news.id”, de primaire sleutel, moet u de GROUP BY-clausule gebruiken voor “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

Other episodes