ActiveRecordにてGROUP BY
のCOUNT
を取りたいとき、他の記事を参考に以下のようなコードを書いたのですが、
Article
.where(is_published: true)
.group(:id)
.order(:count_all)
.count
(例文なので全く意味のないクエリですが、本来はjoinsとか色々やって集計してます)
このorder(:count_all)
のcount_all
がどこから来たのか分からず、調べてもわからなかったのでメモとして残しておきます。
結論
結論として、このcount_all
というカラム名は、引数なしの.count
を呼び出した時にAS
として追加されるCOUNT(*)
のエイリアス名を指定しています。
今回のクエリは最後に引数なしの.count
という集計関数を呼び出していますが、これがないとorder(:count_all)
は機能しません。
実際に吐かれるSQLを見た方が早そう。
SELECT
COUNT(*) AS count_all,
[Article].[id] AS article_id
FROM
[Article]
WHERE
[Article].[is_published] = 1
GROUP BY
[Article].[id]
ORDER BY
[count_all] ASC
このように、たんに.group
のみを行なったカラムにはAS
でテーブル名+カラム名
が、.count
を用いた場合にはcount_all
というエイリアスが指定されています。
もうわかると思いますが、ちなみに.count(:id)
など引数にカラムを追加した場合のエイリアス名はcount_id
になります。
最後に
ちゃんと理解せずにググりながらORMをガチャガチャしていたのでcount_all
が何なのかよくわからずになってしまったのですが、ちゃんと吐き出されるSQLと見比べながらやったら一発でわかる疑問でした。
普通のSQLを書く時は自分でエイリアスを設定するし、感覚的にorder_by
のあとにcount
が来ることはないので、慣れていないと脳がバグりがちですが頑張りたいです。