Результат "Впорядкувати за" підрахунку "групувати за"?


76

Цей запит

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

поверне мені хеш.

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

Тепер я хочу впорядкувати за підрахунком кожної групи. Як я можу це зробити за запитом.

Відповіді:


120

Найпростіший спосіб це зробити - просто додати пропозицію замовлення до вихідного запиту. Якщо ви надаєте методу count конкретне поле, він генерує вихідний стовпець з ім'ям count_ {column}, який можна використовувати в sql, створеному додаванням виклику замовлення:

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

1
Який механізм баз даних ви використовуєте? Яка версія рейок і що створюється sql? Я щойно отримав тест (інша модель), який чудово працює на рейках 3.0.7 ... наприклад @test = Price.where('price is not null').group(:price_date).order('count_price asc').count('price'), що генеруєSELECT 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
Саймон Еллістон Болл

2
Щиро дякую за це. Це заощадило мені стільки часу від мого запиту порівняно з тим, як я це робив раніше! Найважливіший урок: я дізнався, що метод count "генерує вихідний стовпець з ім'ям count_ {column} '! Дякую!
northdig

Я не можу повірити, що це лише 35 (зараз 36) голосів. Так корисно!
jeffdill2

3
Станом на Rails 4+ із PostgreSQL:Message.where(message_type: "incoming").group(:sender_number).order("count(*)").count
Девід Олдрідж

2
Rails 5 з PostgreSQL:Message.where(message_type: "incoming").group(:sender_number).order(:count_all).count
Snow Fox

18

Коли я спробував це, rails видав мені цю помилку

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

Зверніть увагу, що там написано SELECT ... AS count_all

Тому я оновив запит із відповіді @ Simon, щоб виглядати так, і це працює для мене

.order('count_all desc')

Не впевнений, яка версія AR змушує його використовувати count_allзамість, count_idале в 4.2.1 .order("count_id desc")працює.
sameers

Працює для мене. Можливо, ви пропустили .count ('id')?
mahemoff
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.