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

二重クエリ不要!MySQLページネーションの実装方法

はじめに

MySQLでページネーションを実装する際、多くの場合レコード総数を取得するクエリとデータ取得用のクエリの2つを実行する必要があります。しかし、LIMIT句とWHERE句を組み合わせることで、1回のクエリだけでページネーションを実現できます。

本記事では、実際にテーブルを作成し、サンプルデータを投入しながら、二重クエリなしでページネーションを行う手順を解説します。

サンプルテーブルの作成

まず、CREATEコマンドを使用してテーブルを作成します。

mysql>CREATE table RowCountDemo
   -> (
   -> ID int,
   -> Name varchar(100)
   -> );
Query OK, 0 rows affected (0.95 sec)

IDとNameの2つのカラムを持つ「RowCountDemo」というテーブルが作成されました。

テストデータの挿入

続いて、INSERTコマンドでレコードを挿入していきます。

mysql>INSERT into RowCountDemo values(1,'Larry');
Query OK, 1 row affected (0.15 sec)

mysql>INSERT into RowCountDemo values(2,'John');
Query OK, 1 row affected (0.13 sec)

mysql>INSERT into RowCountDemo values(3,'Bela');
Query OK, 1 row affected (0.15 sec)

mysql>INSERT into RowCountDemo values(4,'Jack');
Query OK, 1 row affected (0.11 sec)

mysql>INSERT into RowCountDemo values(5,'Eric');
Query OK, 1 row affected (0.19 sec)

mysql>INSERT into RowCountDemo values(6,'Rami');
Query OK, 1 row affected (0.49 sec)

mysql>INSERT into RowCountDemo values(7,'Sam');
Query OK, 1 row affected (0.14 sec)

mysql>INSERT into RowCountDemo values(8,'Maike');
Query OK, 1 row affected (0.77 sec)

mysql>INSERT into RowCountDemo values(9,'Rocio');
Query OK, 1 row affected (0.13 sec)

mysql>INSERT into RowCountDemo values(10,'Gavin');
Query OK, 1 row affected (0.19 sec)

合計10件のレコードが挿入されました。

登録データの確認

SELECT文ですべてのレコードを表示して確認してみましょう。

mysql>SELECT* from RowCountDemo;

実行結果は以下の通りです。

+------+-------+
| ID   | Name  |
+------+-------+
|    1 | Larry |
|    2 | John  |
|    3 | Bela  |
|    4 | Jack  |
|    5 | Eric  |
|    6 | Rami  |
|    7 | Sam   |
|    8 | Maike |
|    9 | Rocio |
|   10 | Gavin |
+------+-------+
10 rows in set (0.00 sec)

二重クエリなしのページネーション構文

それでは、二重クエリなしでページネーションを行うための構文を見ていきましょう。基本形は以下の通りです。

SELECT column_name From `yourTableName` WHERE someCondition LIMIT value1, value2;

ポイントは次の3点です。

  • LIMIT value1, value2:value1は取得開始位置(オフセット)、value2は取得件数を指定します。
  • WHERE句:条件を指定することで、1回のクエリで対象範囲のデータのみを効率よく取得できます。
  • COUNT(*)不要:別途レコード数を数えるクエリを発行する必要がないため、パフォーマンス向上につながります。

構文の適用例

上記の構文を実際のテーブルに適用してみます。

mysql> SELECT ID,Name FROM `RowCountDemo` WHERE ID > 0 LIMIT 0, 11;

このクエリでは、「IDが0より大きい」という条件ですべてのレコードを対象とし、「LIMIT 0, 11」で先頭から最大11件を取得しています。

実行結果は以下の通りです。

+------+-------+
| ID   | Name  |
+------+-------+
|    1 | Larry |
|    2 | John  |
|    3 | Bela  |
|    4 | Jack  |
|    5 | Eric  |
|    6 | Rami  |
|    7 | Sam   |
|    8 | Maike |
|    9 | Rocio |
|   10 | Gavin |
+------+-------+
10 rows in set (0.00 sec)

まとめ

このように、LIMIT句のオフセットと取得件数、そしてWHERE句による条件指定を組み合わせることで、COUNTクエリを別途実行することなくMySQLのページネーションを実現できます。特に大規模なテーブルを扱う場合、クエリの発行回数を減らすことはアプリケーション全体のレスポンス改善に大きく貢献します。ぜひ実際のプロジェクトでも活用してみてください。

  1. mysqldumpを使わずにMySQLデータベースを複製する方法

    MySQLデータベースを複製する場合、通常はmysqldumpコマンドが使われますが、SQL文だけでテーブルを別のデータベースへコピーすることも可能です。ここでは、CREATE TABLE ... SELECT構文を使った複製方法を解説します。複製に使う基本構文あるデータベースのテーブルを、別のデータベースにそのままコピーしたい場合は、以下の構文を使用します。create table データベース名1.テーブル名1 select * from データベース名2.テーブル名2;この構文では、元のテーブル(データベース名2.テーブル名2)の全データとカラム定義をもとに、新しいテーブル(データベース

  2. MySQLでLIMIT句を使ってページネーション(次の行)を取得する方法

    MySQLでページネーション(特定の範囲の行だけを取得すること)を実現したい場合は、LIMIT句を使用します。LIMIT句では「開始位置(オフセット)」と「取得する行数」を指定できるため、大量のデータの中から必要な部分だけを効率よく取り出せます。この記事では、実際にテーブルを作成し、データを挿入したうえで、次の行を取得するページネーションの具体的な手順を解説します。1. サンプルテーブルを作成するまずはデモ用のテーブルを作成しましょう。以下のSQLでは、自動採番されるidカラムと名前を格納するnameカラムを持つテーブル「demo40」を定義しています。mysql> create tab