2013-01-10 28 views
7

Tôi có một bảng gọi là foo với các lĩnh vực:Cách trả về các hàng được liệt kê theo thứ tự giảm dần COUNT (*)?

- id 

- type 

- parentId 

Tôi muốn chọn một danh sách các IDS phụ huynh, theo thứ tự giảm dần của họ COUNT(*) bao nhiêu lần chúng xuất hiện trong bảng. Một cái gì đó như thế này:

SELECT DISTINCT parentId FROM `foo` 
ORDER BY (COUNT(parentId) DESC where parentId = parentId) 

Cách này có thể được thực hiện một cách hiệu quả nhất và tải ít nhất trên máy chủ?

Có thể có hàng ngàn-hàng trăm ngàn bản ghi trong bảng, do đó bằng tay đi qua mỗi bản ghi là không thể chấp nhận ..

Trả lời

13

Đơn giản chỉ cần bằng cách áp dụng một điều khoản GROUP BY, và giả sử bạn có một chỉ số, FOREIGN KEY, hoặc PRIMARY KEY trên parentId, hiệu suất phải khá tốt. (parentId có vẻ như có thể là FORIEGN KEY, vì vậy hãy đảm bảo xác định ràng buộc để thực thi lập chỉ mục).

SELECT `parentId` 
FROM `foo` 
GROUP BY `parentId` 
ORDER BY COUNT(*) DESC 
1

Làm thế nào điều này có thể được thực hiện một cách hiệu quả nhất và đưa tải ít nhất là trên máy chủ?

Chìa khóa là cách hiệu quả nhất.

Không đếm() chắc chắn, nhưng hiệu quả nhất là ... để đọc một trường mà bạn đang lưu trữ kết quả Đếm. Bạn có thể cập nhật nó bằng trình kích hoạt hoặc sau khi chèn.

Đặc biệt là khi

Có thể có hàng ngàn-hàng trăm ngàn bản ghi trong bảng