2011-08-20 12 views
51

Esta consulta"Ordenar por" resultado del recuento de "grupo por"?

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

me va a devolver un hash.

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

Ahora quiero ordenar por recuento de cada grupo. ¿Cómo puedo hacer eso dentro de la consulta?

Respuesta

82

La manera más fácil de hacerlo es simplemente agregar una cláusula de pedido a la consulta original. Si se le da el método de recuento de un campo específico, se generará una columna de salida con el nombre COUNT_ {columna}, que puede ser utilizado en el SQL generado por la adición de una llamada orden:

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

No funciona para mí no ... –

+1

¿Qué motor de base de datos está utilizando? ¿Qué versión de rieles y cuál es el sql generado? Acabo de obtener un caso de prueba (modelo diferente) que funciona bien en Rails 3.0.7 ... p. Ej. '@test = Price.where ('price is not null'). group (: price_date) .order ('count_price asc'). count ('price')', que genera 'SELECT COUNT (" price "." price ") COMO count_price, price_date AS precio_date FROM" precios "WHERE (precio no es nulo) GROUP BY price_date ORDER BY count_price asc' –

+0

Muchas gracias por esto. ¡Esto me ahorró tanto tiempo de mi consulta en comparación con cómo lo estaba haciendo antes! Lección más importante: ¡aprendí que el método de recuento 'generará una columna de salida con el nombre count_ {columna}'! ¡Gracias! – Yavin4

13

Cuando probé esto, raíles me dio este error

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 

aviso que dice SELECT ... cOMO count_all

Así que actualiza la consulta de @ respuesta de Simón a tener este aspecto y funciona para mí

.order('count_all desc') 
+0

No estoy seguro de qué versión de AR hace que use' count_all' en lugar de 'count_id' pero en 4.2.1,' .order ("count_id desc") 'funciona. – sameers

+0

Funciona para mí. Tal vez te has perdido el .count ('id')? – mahemoff