2011-01-10 22 views
5

Mam problem z łączeniem trzech tabel w mysql.Jak wyjść z łączenia wielu do wielu tabel w mysql?

powiedzmy, że mamy tabelę o nazwie posts który trzymam wpisy w nim, mam tabeli o nazwie likes które przechowywać USER_ID tych i post_id w a trzecia tabela o nazwie comments które przechowywać USER_ID tych i post_id i tekst komentarza w nim .

Potrzebuję kwerendy, która pobiera listę moich wpisów, z liczbą polubień i komentarzy dla każdego wpisu.

Im przy użyciu tej kwerendy:

SELECT posts.id, count(comments.id) as total_comments, count(likes.id) as total_likes 
FROM `posts` 
LEFT OUTER JOIN comments ON comments.post_id = posts.id 
LEFT OUTER JOIN likes ON likes.post_id = posts.id 
GROUP BY posts.id 

ale nie ma problemu z tym zapytaniem, czy komentarze są puste dla elementu, lubi liczba jest po prostu ok, ale powiedzmy, że jeśli wpis ma 2 komentarzy i 4 lubi, zarówno total_comments, jak i total_likes będą miały wartość "8", co oznacza, że ​​mysql je mnoży. Jestem zdezorientowany i nie wiem, co powinienem zrobić.

Dzięki za pomoc.

Odpowiedz

7

Użyj count(distinct comments.id) i count(distinct likes.id), pod warunkiem, że te identyfikatory są unikatowe.

+0

Dzięki, pracował jak czar. – Sallar

4

Więc jest to jeden ze sposobów, aby to podejście (zakładając mysql pozwala tabele pochodne):

SELECT posts.id, comments.total_comments, likes.total_likes 
FROM `posts` 
LEFT OUTER JOIN (select post_id, count(id) as total_comments from comments) comments 
    ON comments.post_id = posts.id 
LEFT OUTER JOIN (select post_id, count(id) as total_likes from likes) likes 
    ON likes.post_id = posts.id 

Można również użyć podzapytania skorelowane. Możesz chcieć, aby w przypadku przypadku nie było uwzględniane umieszczanie wartości 0, gdy nie ma dopasowanych rekordów.

Spróbujmy podzapytanie skorelowane:

SELECT posts.id, 
(select count(Id) from comments where post_id = posts.id) as total_comments, 
(select count(Id) from likes where post_id = posts.id) as total_likes 
FROM `posts` 
+0

dziękuję, ale to zapytanie zwróciło 12 polubień i 2 komentarze do pierwszego rekordu (ma 4 polubienia i 2 komentarze) oraz NULL dla wszystkich pozostałych wierszy. – Sallar

+0

wygląda na to, że skorelowana trasa podkweregów może być najlepsza – HLGEM

+0

Nic o nich nie słyszałem. – Sallar