2011-08-20 42 views
51

Truy vấn này"Sắp xếp theo" kết quả của "nhóm theo" tính?

Message.where("message_type = ?", "incoming").group("sender_number").count 

sẽ trả về giá trị băm.

OrderedHash {"1234"=>21, "2345"=>11, "3456"=>63, "4568"=>100} 

Bây giờ tôi muốn sắp xếp theo số lượng của mỗi nhóm. Làm thế nào tôi có thể làm điều đó trong truy vấn.

Trả lời

82

Cách dễ nhất để thực hiện việc này là chỉ cần thêm mệnh đề đơn đặt hàng vào truy vấn ban đầu. Nếu bạn cung cấp cho các phương pháp đếm một lĩnh vực cụ thể, nó sẽ tạo ra một cột đầu ra với tên count_ {cột}, có thể được sử dụng trong sql tạo ra bằng cách thêm một cuộc gọi theo thứ tự:

Message.where('message_type = ?','incoming') 
     .group('sender_number') 
     .order('count_id asc').count('id') 
+1

Nopes của nó không hoạt động với tôi .. –

+1

Bạn đang sử dụng công cụ cơ sở dữ liệu nào? Phiên bản đường ray nào và sql được tạo ra là gì? Tôi vừa có một trường hợp thử nghiệm (mô hình khác nhau) làm việc tốt trên đường ray 3.0.7 ... ví dụ '@test = Price.where ('price is not null') nhóm (: price_date) .order ('count_price asc') đếm ('price')', tạo ra 'SELECT COUNT (" price "." price ") AS count_price, price_date AS price_date TỪ" giá "WHERE (giá không phải là null) GROUP BY price_date ORDER BY count_price asc ' –

+0

Cảm ơn bạn rất nhiều vì điều này. Điều này đã tiết kiệm cho tôi rất nhiều thời gian truy vấn của tôi so với cách tôi đã làm nó trước đây! Bài học quan trọng nhất: Tôi đã học được rằng phương pháp đếm 'sẽ tạo ra một cột đầu ra với tên count_ {column}'! Cảm ơn bạn! – Yavin4

13

Khi tôi cố gắng này, ray đã cho tôi lỗi này

SQLite3::SQLException: no such column: count_id: SELECT COUNT(*) AS count_all, state AS state FROM "ideas" GROUP BY state ORDER BY count_id desc LIMIT 3 

Chú ý rằng nó nói SELECT ... AS count_all

vì vậy, tôi cập nhật các truy vấn từ @ câu trả lời của Simon trông như thế này và nó làm việc cho tôi

.order('count_all desc') 
+0

Không chắc chắn phiên bản AR nào khiến nó sử dụng' count_all' thay vì 'count_id' nhưng trong 4.2.1,' .order ("count_id desc") 'hoạt động. – sameers

+0

Làm việc cho tôi. Có lẽ bạn đã bỏ lỡ .count ('id')? – mahemoff

Các vấn đề liên quan