2010-01-02 32 views
42

Próbuję utworzyć stronę z wiadomościami dla strony, nad którą pracuję. Zdecydowałem, że chcę używać poprawnych zapytań MySQL (oznaczających COUNT (id) i łączeń zamiast więcej niż jednej kwerendy lub num_rows.) Używam wrappera PDO, który powinien działać poprawnie, a to nadal kończy się niepowodzeniem, gdy uruchamiany jest bezpośrednio przez Aplikacja MySQL CLI.MySQL Multiple Left Joins

Zasadniczo mam 3 tabele. Jedna zawiera wiadomości, jedna zawiera komentarze, a druga zawiera użytkowników. Moim celem jest tutaj stworzenie strony, która wyświetla wszystkie (później będzie się paginować) tytuły wiadomości, ciała, autorów i daty. To zadziałało, gdy użyłem drugiego zapytania, aby uzyskać nazwę użytkownika, ale zdecydowałem, że wolałbym użyć JOIN.

Jaki jest problem? Potrzebuję dwóch złączeń. Jedną z nich jest pobranie nazwy użytkownika autora i drugiej, aby uzyskać liczbę komentarzy. Kiedy po prostu wybieram nazwę użytkownika autora, wszystko działa zgodnie z oczekiwaniami. Wyświetlane są wszystkie wiersze (są 2) w tabeli aktualności. Jednakże, kiedy dodałem to drugie LEWO DOŁĄCZ do wiersza komentarzy, kończę tylko otrzymując jeden wiersz z wiadomości (pamiętaj, że są 2,) i COUNT (comments.id) daje mi 2 (powinien pokazać 1, jak mam komentarz do każdego posta.)

Co robię źle? Dlaczego wyświetla tylko jeden wpis z wiadomościami i mówi, że ma dwa komentarze, gdy są dwa newsy, każdy z jednym komentarzem?

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 

również, żeby mieć pewność, o jednej rzeczy, mój lewy dołączyć do komentarzy jest poprawny sposób, aby uzyskać wszystkie posty, niezależnie od tego, czy mają uwagi lub nie, prawda? Czy może to być prawo dołączyć? Och, ostatnia rzecz ... jeśli zmienię comments.news_id = news.id na news.id = comments.news_id, otrzymam 0 wyników.

Odpowiedz

80

Brakuje klauzuli 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 

Lewa przyłączenia jest poprawna. Jeśli używałeś INNER lub RIGHT JOIN, nie otrzymywałbyś wiadomości, które nie miały komentarzy.

+0

Czy musisz używać grupy jako? Moje podwójne połączenie podwójne nie działa i próbuję dowiedzieć się, dlaczego. –

+0

Dzięki - pomógł mi rozwiązać problem, który był na tyle trudny, że mogłem poświęcić 3 godziny - rozwiązany w kilka minut – Muhammad

+0

Wielkie wielkie dzięki koleś. Rozwiązał mój problem, jak również :). – C4u

7

Aby wyświetlić wszystkie szczegóły każdego tytułu wiadomości, np. "news.id", który jest kluczem podstawowym, musisz użyć klauzuli GROUP BY dla "nowys.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