it-swarm.com.de

MySQL-Linksverknüpfungen

Ich versuche, eine News-Seite für eine Website zu erstellen, an der ich gerade arbeite. Ich entschied, dass ich korrekte MySQL-Abfragen verwenden möchte (dh COUNT (id) und Verknüpfungen anstelle von mehreren Abfragen oder num_rows.) Ich verwende einen PDO-Wrapper, der einwandfrei funktionieren sollte, und dies schlägt fehl, wenn er direkt durch die MySQL-CLI-Anwendung.

Grundsätzlich habe ich 3 Tische. Man hält die Nachrichten, man hält die Kommentare und man hält die Benutzer. Mein Ziel hier ist es, eine Seite zu erstellen, auf der alle Nachrichten (Titel, Körper, Autoren und Datumsangaben) angezeigt werden. Dies funktionierte gut, als ich eine zweite Abfrage verwendete, um den Benutzernamen zu erhalten, aber dann entschied ich mich, lieber einen JOIN zu verwenden.

Also, was ist das Problem? Nun, ich brauche zwei Verbindungen. Eine ist, den Benutzernamen des Autors und die andere die Anzahl der Kommentare zu erhalten. Wenn ich einfach den Benutzernamen des Autors suche, funktioniert alles wie erwartet. Alle Zeilen (es gibt 2) in der Nachrichtentabelle werden angezeigt. Wenn ich jedoch diesen zweiten LEFT JOIN für die Kommentarzeile hinzufügte, erhalte ich am Ende nur eine Zeile aus news (denken Sie daran, es gibt 2), und COUNT (comments.id) gibt mir 2 (es sollte 1 anzeigen, wie ich es getan habe einen Kommentar für jeden Beitrag.)

Was mache ich falsch? Warum zeigt es nur einen News-Post an und sagt, dass es zwei Kommentare hat, wenn es zwei News-Posts mit jeweils einem Kommentar gibt?

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

Nur um sicher zu sein, dass mein linker Beitritt zu Kommentaren der richtige Weg ist, um alle Beiträge zu erhalten, unabhängig davon, ob sie Kommentare haben oder nicht, richtig? Oder wäre das ein richtiger Beitritt? Oh, noch eine letzte Sache ... Wenn ich comments.news_id = news.id auf news.id = comments.news_id umstelle, bekomme ich 0 Ergebnisse.

50
John M.

Ihnen fehlt eine GROUP BY-Klausel:

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

Der linke Join ist korrekt. Wenn Sie eine INNER- oder RECHTE VERBINDUNG verwendet haben, erhalten Sie keine Nachrichten, die keine Kommentare enthalten.

94
Mark Byers

Um alle Details für jeden Newspostentitel anzuzeigen, z. "news.id" ist der Primärschlüssel. Sie müssen die GROUP BY-Klausel für "news.id" verwenden.

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
7
rizon

Um alle Details für jeden Newspostentitel anzuzeigen, z. "news.id" ist der Primärschlüssel. Sie müssen die GROUP BY-Klausel für "news.id" verwenden.

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
0
Youssof Hammoud