28
21

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 5 years have passed since last update.

RailsでCOUNT DISTINCTする方法

Last updated at Posted at 2014-11-07

よく忘れるのでメモ。

通常はリレーションで解決するのであまり使いませんが、Rails(ActiveRecord)で SELECT COUNT(DISTINCT some_id) FROM users のようなSQLを実装する方法です。
少し古い情報には

User.count(:some_id, distinct: true)

と書いてあることが多いですが、rails4ではこの方法ではできません。
以下のようにすれば実装できます。

User.distinct.count(:some_id)

以下のSQLに展開されます。

SELECT DISTINCT COUNT(DISTINCT `users`.`some_id`) FROM `users`

追記

上記のSQLだと全件サーチになるのですごく遅いです。

SELECT COUNT(DISTINCT `users`.`some_id`) FROM `users`

ならUsing index for group-byになってかなり速くなります。が、このSQLをARで生成する方法が分からない。

仕方なく

User.count('DISTINCT some_id')

にしたところ後者のSQLに展開されました。

28
21
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
28
21

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?