MySQLのOFFSET句で最初のN行をスキップして最後のN行を選択する方法
MySQLの最後のN行を選択する
MySQLデータベースから最後のN行を選択するには、いくつかの方法があります。
方法
- LIMIT句を使用する
これは最も簡単な方法です。
SELECT * FROM テーブル名 ORDER BY id DESC LIMIT N;
このクエリは、テーブル名
テーブルから、id
列に基づいて降順に並べ替えた最後のN行を選択します。
- サブクエリを使用する
SELECT * FROM (
SELECT * FROM テーブル名 ORDER BY id DESC
) AS t
LIMIT N;
- 変数を使用する
SET @row_num = 0;
SELECT * FROM テーブル名
ORDER BY id DESC
LIMIT @row_num, N;
SET @row_num := @row_num + N;
このクエリは、@row_num
変数を使用して、選択する最初の行の番号を追跡します。
例
users
テーブルから最後の5行を選択するには、次のようなクエリを使用できます。
SELECT * FROM users ORDER BY id DESC LIMIT 5;
出力
| id | name | email |
|---|---|---|
| 10 | John Doe | [email protected] |
| 9 | Jane Doe | [email protected] |
| 8 | Peter Smith | [email protected] |
| 7 | Sarah Jones | [email protected] |
| 6 | Michael Brown | [email protected] |
注意事項
ORDER BY
句は、選択する行をどのように並べ替えるかを指定するために使用されます。LIMIT
句は、選択する行の数を指定するために使用されます。
# テーブル作成
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL
);
# データ挿入
INSERT INTO users (name, email) VALUES ('John Doe', '[email protected]');
INSERT INTO users (name, email) VALUES ('Jane Doe', '[email protected]');
INSERT INTO users (name, email) VALUES ('Peter Smith', '[email protected]');
INSERT INTO users (name, email) VALUES ('Sarah Jones', '[email protected]');
INSERT INTO users (name, email) VALUES ('Michael Brown', '[email protected]');
# 最後の5行を選択
SELECT * FROM users ORDER BY id DESC LIMIT 5;
# 結果
# | id | name | email |
# |---|---|---|
# | 5 | Michael Brown | michael.brown@example.com |
# | 4 | Sarah Jones | sarah.jones@example.com |
# | 3 | Peter Smith | peter.smith@example.com |
# | 2 | Jane Doe | jane.doe@example.com |
# | 1 | John Doe | john.doe@example.com |
上記のサンプルコード以外にも、最後のN行を選択する方法はいくつかあります。
- LIMITとOFFSETを使用する
SELECT * FROM users ORDER BY id DESC LIMIT N OFFSET M;
このクエリは、OFFSET
句を使用して、最初のN行をスキップしてから、次のM行を選択します。
SELECT * FROM (
SELECT * FROM users ORDER BY id DESC
LIMIT N
) AS t;
このクエリは、LIMIT
句を使用して、サブクエリから最初のN行を選択します。
最後のN行を選択するその他の方法
SELECT * FROM テーブル名 ORDER BY id DESC LIMIT N OFFSET M;
例:
SELECT * FROM users ORDER BY id DESC LIMIT 5 OFFSET 10;
SELECT * FROM (
SELECT * FROM テーブル名 ORDER BY id DESC
LIMIT N
) AS t;
この方法では、サブクエリを使用して最初のN行を選択し、その結果を外部クエリで選択します。
SELECT * FROM (
SELECT * FROM users ORDER BY id DESC
LIMIT 5
) AS t;
ファイルポインタを使用する
SELECT * FROM テーブル名 ORDER BY id DESC
LIMIT N
INTO OUTFILE '/tmp/output.txt';
LOAD DATA INFILE '/tmp/output.txt' INTO TABLE テーブル名;
この方法では、LIMIT
句を使用して最初のN行をファイルに書き込み、その後、LOAD DATA INFILE
ステートメントを使用してそのファイルをテーブルにロードします。
SELECT * FROM users ORDER BY id DESC
LIMIT 5
INTO OUTFILE '/tmp/output.txt';
LOAD DATA INFILE '/tmp/output.txt' INTO TABLE users;
このクエリは、users
テーブルから、id
列に基づいて降順に並べ替えた最後の5行を/tmp/output.txt
ファイルに書き込み、その後、そのファイルをusers
テーブルにロードします。
一時テーブルを使用する
CREATE TEMPORARY TABLE tmp_table AS
SELECT * FROM テーブル名 ORDER BY id DESC
LIMIT N;
SELECT * FROM tmp_table;
DROP TABLE tmp_table;
この方法では、LIMIT
句を使用して最初のN行を一時テーブルに挿入し、その後、その一時テーブルからデータを選択します。
CREATE TEMPORARY TABLE tmp_table AS
SELECT * FROM users ORDER BY id DESC
LIMIT 5;
SELECT * FROM tmp_table;
DROP TABLE tmp_table;
このクエリは、users
テーブルから、id
列に基づいて降順に並べ替えた最後の5行を一時テーブルtmp_table
に挿入し、その後、その一時テーブルからデータを選択して、最後に一時テーブルを削除します。
- 速度が重要な場合は、
LIMIT
とOFFSET
を使用する方法が最も効率的です。 - 柔軟性が重要な場合は、サブクエリを使用する方法が最も便利です。
- 大量のデータを選択する場合は、ファイルポインタを使用する方法が最も効率的です。
- 複雑なクエリを使用する場合は、一時テーブルを使用する方法が最も便利です。
mysql database