2011-01-24 38 views

Trả lời

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 

(Lưu ý: MySQL có cú pháp đặc biệt cho phép bạn GROUP BY mà không tập hợp tất cả các giá trị, nó dành cho chính xác trường hợp này).

3

Sử dụng truy vấn phụ.

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

Các subquery là không cần thiết. –

2

Hãy thử điều này:

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 

này sẽ kết hợp 2 bảng, và đếm số lượng các mục trong bảng Posts. Nếu không có thì số đếm là 0 (IFNULL).

+0

Bạn có thực sự cần IFNULL không? Không nên COUNT trả lại 0 nếu không gặp phải các giá trị post_from_blogger_id không NULL –

+0

Và bạn thiếu GROUP BY để cho phép COUNT hoạt động. –

+0

Bây giờ bạn đã thêm GROUP BY, bạn có thể tận dụng lợi thế của MySQL và chỉ bao gồm blogger_id trong danh sách các cột được nhóm theo. –

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

thử LEFT JOIN cho câu hỏi này

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 
Các vấn đề liên quan