"Sortieren nach" Ergebnis der "Gruppieren nach" Anzahl?

75

Diese Abfrage

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

wird mir einen Hash zurückgeben.

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

Jetzt möchte ich nach Anzahl jeder Gruppe bestellen. Wie kann ich das innerhalb der Abfrage tun?

Mohit Jain
quelle

Antworten:

120

Der einfachste Weg, dies zu tun, besteht darin, der ursprünglichen Abfrage einfach eine Bestellklausel hinzuzufügen. Wenn Sie der Zählmethode ein bestimmtes Feld zuweisen, wird eine Ausgabespalte mit dem Namen count_ {column} generiert, die in der durch Hinzufügen eines Auftragsaufrufs generierten SQL verwendet werden kann:

Message.where('message_type = ?','incoming')
       .group('sender_number')
       .order('count_id asc').count('id')
Simon Elliston Ball
quelle
1
Welches Datenbankmodul verwenden Sie? Welche Version von Rails und wie lautet die generierte SQL? Ich habe gerade einen Testfall (anderes Modell), der auf Schienen 3.0.7 gut funktioniert ... zB @test = Price.where('price is not null').group(:price_date).order('count_price asc').count('price'), der erzeugtSELECT COUNT("prices"."price") AS count_price, price_date AS price_date FROM "prices" WHERE (price is not null) GROUP BY price_date ORDER BY count_price asc
Simon Elliston Ball
2
Vielen Dank dafür. Dies ersparte mir so viel Zeit bei meiner Anfrage im Vergleich zu früher! Wichtigste Lektion: Ich habe gelernt, dass die Zählmethode 'eine Ausgabespalte mit dem Namen count_ {column}' generiert! Vielen Dank!
Northdig
Ich kann nicht glauben, dass dies nur 35 (jetzt 36) positive Stimmen hat. So nützlich!
Jeffdill2
3
Ab Rails 4+ mit PostgreSQL:Message.where(message_type: "incoming").group(:sender_number).order("count(*)").count
David Aldridge
2
Rails 5 mit PostgreSQL:Message.where(message_type: "incoming").group(:sender_number).order(:count_all).count
Snow Fox
18

Als ich das versuchte, gab mir Rails diesen Fehler

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

Beachten Sie, dass dort SELECT ... AS count_all steht

Also habe ich die Abfrage von @ Simons Antwort so aktualisiert, dass sie so aussieht, und sie funktioniert für mich

.order('count_all desc')
Penner
quelle
Nicht sicher, welche AR-Version die Verwendung count_allanstelle von count_id4.2.1 bewirkt , .order("count_id desc")funktioniert.
Sameers
Funktioniert bei mir. Vielleicht haben Sie die .count ('id') verpasst?
Mahemoff