1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Rails】ActiveRecord の order(:count_all) とは何なのか

Posted at

ActiveRecordにてGROUP BYCOUNTを取りたいとき、他の記事を参考に以下のようなコードを書いたのですが、

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が来ることはないので、慣れていないと脳がバグりがちですが頑張りたいです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?