ページネーションなどを実装するときに、実際に取得するデータをLimitでとりつつ、総レコード数を取得したい時があります。
同じクエリ条件でcount
を使って再度クエリ発行すればできますが、MySQLを使っている場合はFOWND_ROWS
とSQL_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"}
参考