2011-08-20 7 views
51

Bu sorgu"Grup by" sayım sonucu "Sipariş" ile mi?

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

bana bir karma dönecektir.

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

Şimdi her gruba göre sıralamak istiyorum. Bunu sorguda nasıl yapabilirim.

cevap

82

Bunu yapmanın en kolay yolu, yalnızca orijinal sorguya bir sipariş cümlesi eklemektir. Ben bu çalıştığımda

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

Nopes onun için çalışmıyor .. –

+1

Hangi veritabanı motorunu kullanıyorsunuz? Rayların hangi sürümü ve üretilen sql nedir? Sadece 3.0.7 raylar üzerinde iyi çalışan bir test durumu (farklı model) var. @test = Price.where ('fiyat null' değil) grup (: price_date) .order ('count_price asc'). 'SELECT COUNT ("fiyatlar") oluşturan fiyat (fiyat). ") AS count_price, price_date AS price_date FROM" fiyatlar "WHERE (fiyat null değil) GROUP BY price_date ORDER BY count_price asc' –

+0

Bunun için çok teşekkür ederim. Bu, daha önce nasıl yaptığımla karşılaştırılınca, sorgulamamda çok zaman biriktirdi! En önemli ders: Sayım yönteminin 'count_ {column}' ismiyle bir çıktı sütunu üreteceğini öğrendim! Teşekkür ederim! – Yavin4

13

: Eğer sayım yöntemini belirli bir alan verirsek, bu bir emirdir çağrı ekleyerek oluşturulan sql kullanılabilecek adı count_ {sütun} ile bir çıkış sütunu üretecektir raylar o SEÇ ... gİBİ count_all

Bu yüzden bu gibi görünmek Simon'un cevap @ gelen sorgu güncelleştirilmiş diyor

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 

Bildirim bana bu hatayı verdi ve bana

için çalışıyor
+0

Hangi AR sürümünün kullanılmasına neden olduğuna emin olun ' count_all 'yerine count_id' yerine 4.2.1,' .order ("count_id desc") 'çalışır. – sameers

+0

Benim için çalışıyor. Belki de .count'u ('id') özledin? – mahemoff