2011-08-20 11 views
51

Questa query"Ordina per" risultato di "raggruppa per" conteggio?

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

mi restituirà un hash.

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

Ora voglio ordinare per numero di ciascun gruppo. Come posso farlo all'interno della query.

risposta

82

Il modo più semplice per eseguire questa operazione è aggiungere semplicemente una clausola di ordine alla query originale. Se si dà il metodo di conteggio un campo specifico, si genererà una colonna di output con il nome count_ {colonna}, che può essere utilizzato nel codice SQL generato con l'aggiunta di una chiamata in ordine:

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

Nopes non funziona per me .. –

+1

Quale motore di database stai usando? Quale versione di rail e qual è il sql generato? Ho appena avuto un caso di prova (modello diverso) che funziona bene su rotaie 3.0.7 ... ad es. '@test = Price.where ('price is not null'). group (: price_date) .order ('count_price asc'). count ('price')', che genera 'SELECT COUNT (" prices "." price ") AS count_price, price_date AS price_date FROM" prices "WHERE (il prezzo non è nullo) GROUP BY price_date ORDINA PER count_price asc' –

+0

Grazie mille per questo. Questo mi ha risparmiato così tanto tempo rispetto alla mia domanda rispetto a come lo stavo facendo prima! La lezione più importante: ho imparato che il metodo count 'genererà una colonna di output con il nome count_ {column}'! Grazie! – Yavin4

13

Quando ho provato questo, rotaie mi ha dato questo errore

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 

noti che si dice SELECT ... AS count_all

Così ho aggiornato la query da @ risposta di Simon a guardare come questo e funziona per me

.order('count_all desc') 
+0

Non sono sicuro quale versione di AR ne induca a usare' count_all' invece di 'count_id' ma in 4.2.1,' .order ("count_id desc") 'funziona. – sameers

+0

Funziona per me. Forse hai perso il .count ('id')? – mahemoff