2011-01-10 7 views
5

Ho un problema con l'unione di tre tabelle in mysql.Come lasciare unire più tabelle da uno a molti in mysql?

consente di dire che abbiamo una tabella denominata posts che tengo le mie entrate in esso, ho una tabella denominata likes che devo conservare user_id di e post_id di dentro e una terza tabella denominata comments che devo conservare user_id di e post_id di e testo di commento al suo interno .

Ho bisogno di una query che recuperi l'elenco delle mie voci, con il numero di Mi piace e commenti per ogni voce.

Im usando questa query:

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 

ma c'è un problema con questa query, se i commenti sono vuoti per un elemento, ama conteggio è appena discreto, ma consente di dire se una voce ha 2 commenti e 4 Mi piace, sia total_comments che total_likes saranno "8", il che significa che mysql li moltiplica. Sono confuso e non so che cosa dovrei fare.

Grazie in anticipo.

risposta

7

Utilizzare count(distinct comments.id) e count(distinct likes.id), a condizione che questi ID siano univoci.

+0

Grazie, ha funzionato come un fascino. – Sallar

4

Beh questo è un modo di avvicinarsi (supponendo mysql consente tabelle derivate):

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 

Si potrebbe anche usare subquery correlate. Potresti desiderare una dichiarazione del caso in cui conti per inserire 0 quando non ci sono record corrispondenti.

Proviamo una subquery correlata:

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

grazie, ma questa query ha restituito 12 Mi piace e 2 commenti per il primo record (ha 4 Mi piace e 2 commenti) e NULL per tutte le altre righe. – Sallar

+0

sembra che il percorso di subquery correlato potrebbe essere il migliore – HLGEM

+0

Non ho sentito nulla su di loro. – Sallar