2010-01-02 19 views
42

Sto cercando di creare una pagina di notizie per un sito Web su cui sto lavorando. Ho deciso di utilizzare le query MySQL corrette (ovvero COUNT (id) e join invece di più query o num_rows.) Sto usando un wrapper PDO, che dovrebbe funzionare correttamente, e questo non riesce ancora quando viene eseguito direttamente attraverso Applicazione CLI MySQL.MySQL Multiple Left Joins

Fondamentalmente, ho 3 tabelle. Uno tiene la notizia, uno tiene i commenti e uno tiene gli utenti. Il mio obiettivo qui è quello di creare una pagina che mostri tutti (impaginerà in seguito) i titoli di notizie, corpi, autori e date. Questo ha funzionato bene quando ho usato una seconda query per ottenere il nome utente, ma poi ho deciso che preferirei usare un JOIN.

Quindi qual è il problema? Bene, ho bisogno di due join. Uno è quello di ottenere il nome utente dell'autore e l'altro per ottenere il numero di commenti. Quando scelgo semplicemente il nome utente dell'autore, tutto funziona come previsto. Vengono visualizzate tutte le righe (ci sono 2) nella tabella delle notizie. Tuttavia, quando ho aggiunto questo secondo LEFT JOIN per la riga dei commenti, finisco per ricevere solo una riga dalle notizie (ricorda, ci sono 2,) e COUNT (comments.id) mi dà 2 (dovrebbe mostrare 1, come ho un commento per ogni post.)

Cosa sto facendo di sbagliato? Perché mostra solo un post di notizie e dice che ha due commenti, quando ci sono due post di notizie, ciascuno con un commento?

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 

Inoltre, giusto per essere sicuro di una cosa, mia sinistra unirsi ai commenti è il modo corretto per ottenere tutti i messaggi, indipendentemente dal fatto che abbiano commenti o no, giusto? O sarebbe giusto unirsi? Oh, un'ultima cosa ... se cambio commenti.news_id = news.id a news.id = comments.news_id, ottengo 0 risultati.

risposta

80

Stai manca una clausola 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 sinistra join è corretta. Se hai usato un INNER o RIGHT JOIN allora non avresti ottenuto gli articoli che non avevano commenti.

+0

DOVETE utilizzare il gruppo per? Il mio doppio join da principiante non funziona, e sto cercando di scoprire perché. –

+0

Grazie - mi ha aiutato a risolvere un problema che è stato abbastanza difficile per me per passare 3 ore - risolto solo in minuti – Muhammad

+0

Grande grande grazie amico. Risolto il mio problema :) – C4u

7

Per visualizzare tutti i dettagli per ciascun titolo di post di notizie, ad es. "news.id", che è la chiave primaria, è necessario utilizzare la clausola GROUP BY per "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