0
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.

ActiveRecordでSQL_CALC_FOUND_ROWSを使う

Posted at

ページネーションなどを実装するときに、実際に取得するデータをLimitでとりつつ、総レコード数を取得したい時があります。

同じクエリ条件でcountを使って再度クエリ発行すればできますが、MySQLを使っている場合はFOWND_ROWSSQL_CALC_FOUND_ROWSを使えば実現できます。

FOUND_ROWS

直前のSQLで返されたレコード数が取得できるMySQLの関数です。
実際にクライアントに返されたレコード数なので、LIMITをつけているとLIMITで制限されたレコード数が取得されます。

SQL_CALC_FOUND_ROWS

SELECT文にこのオプションをつけると、FOUND_ROWSの結果が、直前のSQLで検索された総レコード数になります。
つまり、LIMITをつけてクライアントに返されるデータを制限した場合でも、そのSQLでcountした場合と同じレコード数が返ってくるようになります。

ActiveRecordでの使い方

Articleテーブルにレコードが10件入っている場合。

Article.select([
  'SQL_CALC_FOUND_ROWS id',
  :title,
  :posted_at
])
.order(:posted_at)
.take(5)

ActiveRecord::Base.connection.select_one("SELECT FOUND_ROWS() as count")
#  => {"count"=>"10"}

参考

0
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
0
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?