2011-01-24 11 views

risposta

40
SELECT bloggers.*, COUNT(post_id) AS post_count 
    FROM bloggers LEFT JOIN blogger_posts 
    ON bloggers.blogger_id = blogger_posts.blogger_id 
    GROUP BY bloggers.blogger_id 
    ORDER BY post_count 

(Nota: MySQL ha particolare sintassi che si GROUP BY consente senza aggregando tutti i valori, è destinato esattamente per questa situazione).

3

Utilizzare sottoquery.

select * from (
    select post_from_blogger_id, count(1) N from Posts 
    group by post_from_blogger_id) t 
order by N desc 
+0

Il subquery non è necessario. –

2

Prova questo:

SELECT B.blogger_id, 
     B.blogger_name, 
     IFNULL(COUNT(P.post_from_blogger_id),0) AS NumPosts 
From Blogger AS B 
LEFT JOIN Posts AS P ON P.post_from_blogger_id = B.blogger_id 
GROUP BY B.blogger_id, B.blogger_name 
ORDER BY COUNT(P.post_from_blogger_id) DESC 

Questo unisce i 2 tavoli, e conta il numero di voci nella tabella Posts. Se non ce ne sono, il conteggio è 0 (IFNULL).

+0

Hai davvero bisogno dell'IFNULL? COUNT non dovrebbe restituire 0 se non vengono riscontrati valori non post NULL post_from_blogger_id? –

+0

E ti manca un GROUP BY per consentire il funzionamento del COUNT. –

+0

Ora che hai aggiunto GROUP BY, puoi usufruire di MySQL e includere solo blogger_id nell'elenco delle colonne raggruppate. –

2
SELECT b.* 
FROM Bloggers AS b 
LEFT JOIN (
    SELECT post_from_blogger_id, COUNT(*) AS post_count 
    FROM Posts 
    GROUP BY post_from_blogger_id 
) AS p ON b.blogger_id = p.post_from_blogger_id 
ORDER BY p.post_count DESC 
1

provare LEFT JOIN per questa domanda

SELECT DISTINCT(Bloggers.blogger_id), 
(select count(post_from_blogger_id) from Posts 
where Posts.post_from_blogger_id=Bloggers.blogger_id) post_from_blogger_id FROM Bloggers 
LEFT OUTER JOIN Posts ON Bloggers.blogger_id=Posts.post_from_blogger_id 
ORDER BY post_from_blogger_id DESC 
Problemi correlati