MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLでLIMIT使用時に行の総数を取得する方法【SQL_CALC_FOUND_ROWS】

MySQLでLIMIT句を使ったページネーションなどを実装する際、「LIMITを付けなかった場合の総行数」を知りたいケースはよくあります。そんなときに便利なのが、SELECT文に付加できるSQL_CALC_FOUND_ROWSオプションです。

SQL_CALC_FOUND_ROWSの基本構文

LIMIT使用時に行の総数を取得するには、次の構文を使用します。

select SQL_CALC_FOUND_ROWS * FROM yourTableName LIMIT 0,yourLastValue;

SQL_CALC_FOUND_ROWSを指定すると、LIMIT句があっても、あたかもLIMITが存在しない場合と同様に行数を計算します。計算された行数は、直後に実行するSELECT FOUND_ROWS();で取得できます。

サンプルテーブルの作成

それでは、動作を確認するためにテーブルを作成しましょう。テーブル作成のクエリは以下のとおりです。

mysql> create table RowsUsingLimit
    -> (
    -> Id int NOT NULL,
    -> Name varchar(10)
    -> );
Query OK, 0 rows affected (3.50 sec)

テストデータの挿入

次に、INSERTコマンドでいくつかのレコードをテーブルに挿入します。

mysql> insert into RowsUsingLimit values(10,'Larry');
Query OK, 1 row affected (0.17 sec)
mysql> insert into RowsUsingLimit values(9,'Mike');
Query OK, 1 row affected (0.19 sec)
mysql> insert into RowsUsingLimit values(15,'Sam');
Query OK, 1 row affected (0.18 sec)
mysql> insert into RowsUsingLimit values(20,'Bob');
Query OK, 1 row affected (0.17 sec)
mysql> insert into RowsUsingLimit values(1,'Carol');
Query OK, 1 row affected (0.14 sec)
mysql> insert into RowsUsingLimit values(18,'David');
Query OK, 1 row affected (0.13 sec)

登録データの確認

SELECT文を使って、テーブル内のすべてのレコードを表示します。

mysql> select *from RowsUsingLimit;

出力結果は以下のとおりです。

+----+-------+
| Id | Name  |
+----+-------+
| 10 | Larry |
|  9 | Mike  |
| 15 | Sam   |
| 20 | Bob   |
|  1 | Carol |
| 18 | David |
+----+-------+
6 rows in set (0.00 sec)

LIMIT使用時に総行数を取得するクエリ

ここで、SQL_CALC_FOUND_ROWSを使いながらLIMITを適用するクエリを実行します。

mysql> select SQL_CALC_FOUND_ROWS * FROM RowsUsingLimit LIMIT 0,6;

出力結果:

+----+-------+
| Id | Name  |
+----+-------+
| 10 | Larry |
|  9 | Mike  |
| 15 | Sam   |
| 20 | Bob   |
|  1 | Carol |
| 18 | David |
+----+-------+
6 rows in set (0.00 sec)

このクエリの直後にFOUND_ROWS()関数を実行すると、LIMITを無視した総行数「6」を取得できます。

mysql> SELECT FOUND_ROWS();
+--------------+
| FOUND_ROWS() |
+--------------+
|            6 |
+--------------+
1 row in set (0.00 sec)

注意:MySQL 8.0.17以降では非推奨

SQL_CALC_FOUND_ROWSおよびFOUND_ROWS()は、MySQL 8.0.17以降で非推奨(Deprecated)となっており、将来のバージョンで削除される予定です。新規プロジェクトでは、以下のような代替手段の利用が推奨されます。

  • 別途COUNT(*)クエリを実行するSELECT COUNT(*) FROM yourTableName;を別途実行して総行数を取得します。
  • ウィンドウ関数を活用する:MySQL 8.0以降ならCOUNT(*) OVER()を併用することで、1回のクエリで総行数を一緒に取得できます。
SELECT *, COUNT(*) OVER() AS total_rows
FROM yourTableName
LIMIT 0, 6;

用途やMySQLのバージョンに応じて、最適な方法を選択してください。

  1. MySQLでテーブルから特定の行を抽出するクエリの書き方

    MySQLでは、WHERE句とORDER BY、LIMITを組み合わせることで、テーブルから条件に合致する特定の行だけを効率的に取得できます。本記事では、実際にサンプルテーブルを作成し、特定の行を抽出するクエリの実行手順をわかりやすく解説します。 1. サンプルテーブルの作成 まず、CREATE TABLE文を使ってサンプル用のテーブルを作成します。ここでは「Section(組)」と「StudentName(生徒名)」という2つのカラムを持つテーブルを用意しました。 mysql> create table DemoTable1972 ( Section char(1),

  2. MySQLで複数テーブルにまたがる結果の総数を制限する方法

    UNION ALLとLIMITを組み合わせて結果の総数を制限する複数のテーブルにまたがる検索結果の合計件数を制限したい場合は、UNION ALLとLIMITを組み合わせることで実現できます。この記事では、例として3つのテーブルを作成し、それぞれの結果を結合した上で全体の件数を制限する手順を具体的に解説します。1つ目のテーブル(demo3)を作成するまず、次のクエリで最初のテーブルを作成します。mysql> create table demo3 -> ( -> value int -> ); Query OK, 0 rows affected (1.39 sec)続いて、