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

MySQLで条件に一致する最後のレコードを削除する方法(ORDER BY DESCとLIMITの使い方)

MySQLで条件に一致する最後のレコードを削除する方法

MySQLのテーブルから、特定の条件に一致する「最後のレコード」を削除したい場合は、DELETE文にORDER BY DESCLIMITを組み合わせて使用します。この方法を使えば、条件を満たすレコードの中で最も新しい(または最も古い)1件だけを簡単に削除できます。

基本構文

DELETE FROM テーブル名 WHERE カラム名1=値 ORDER BY カラム名2 DESC LIMIT 1;

この構文では、指定したカラムを降順(DESC)でソートし、その先頭の1件を削除します。降順ソートの先頭に来るのは「最も新しいレコード」なので、結果として条件に一致する最後のレコードが削除される仕組みです。

実際に試してみよう:テーブルの作成

まず、サンプル用のテーブルを作成します。ここでは、ユーザーのログイン履歴を管理するテーブルを例にします。Idは自動採番の主キー、UserIdはユーザーID、UserLoginDateTimeはログイン日時を格納します。

mysql> create table UserLoginTable
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> UserId int,
-> UserLoginDateTime datetime,
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.94 sec)

レコードの挿入

次に、INSERTコマンドを使ってテーブルにサンプルデータを追加します。

mysql> insert into UserLoginTable(UserId,UserLoginDateTime) values(2,'2019-01-27 13:47:20');
Query OK, 1 row affected (0.19 sec)
mysql> insert into UserLoginTable(UserId,UserLoginDateTime) values(1,'2018-11-28 12:30:12');
Query OK, 1 row affected (0.16 sec)
mysql> insert into UserLoginTable(UserId,UserLoginDateTime) values(2,'2019-01-26 11:30:30');
Query OK, 1 row affected (0.20 sec)
mysql> insert into UserLoginTable(UserId,UserLoginDateTime) values(1,'2015-03-11 15:23:55');
Query OK, 1 row affected (0.21 sec)
mysql> insert into UserLoginTable(UserId,UserLoginDateTime) values(2,'2019-03-21 16:01:56');
Query OK, 1 row affected (0.23 sec)

登録データの確認

SELECT文でテーブルの全レコードを表示してみましょう。

mysql> select *from UserLoginTable;

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

+----+--------+---------------------+
| Id | UserId | UserLoginDateTime |
+----+--------+---------------------+
| 1 | 2 | 2019-01-27 13:47:20 |
| 2 | 1 | 2018-11-28 12:30:12 |
| 3 | 2 | 2019-01-26 11:30:30 |
| 4 | 1 | 2015-03-11 15:23:55 |
| 5 | 2 | 2019-03-21 16:01:56 |
+----+--------+---------------------+
5 rows in set (0.00 sec)

条件に一致する最後のレコードを削除する

それでは、UserId=2のレコードの中で、ログイン日時が最も新しいレコードを削除してみましょう。

mysql> delete from UserLoginTable where UserId=2 ORDER BY UserLoginDateTime DESC LIMIT 1;
Query OK, 1 row affected (0.16 sec)

このクエリは、UserLoginDateTimeを降順にソートし、先頭の1件を削除します。つまり、UserId=2の中で最も新しい「2019-03-21 16:01:56」のレコードが削除対象となります。

削除後の確認

再度SELECT文を実行して、削除が正しく行われたか確認します。

mysql> select *from UserLoginTable;

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

+----+--------+---------------------+
| Id | UserId | UserLoginDateTime |
+----+--------+---------------------+
| 1 | 2 | 2019-01-27 13:47:20 |
| 2 | 1 | 2018-11-28 12:30:12 |
| 3 | 2 | 2019-01-26 11:30:30 |
| 4 | 1 | 2015-03-11 15:23:55 |
+----+--------+---------------------+
4 rows in set (0.00 sec)

このように、UserIdが2のレコードのうち、最も新しいログイン日時のレコードだけが削除されました。

まとめ

MySQLで条件に一致する最後のレコードを削除するには、DELETE文に「ORDER BY カラム名 DESC」と「LIMIT 1」を組み合わせます。降順ソートの先頭に来るレコードが削除される仕組みを利用することで、特定の条件を満たす最新のレコードだけを簡単に削除できます。ログ履歴の整理など、実務でもよく使われるテクニックなので、ぜひ覚えておきましょう。

  1. MySQLでテーブル名を変更する方法|ALTER TABLEとRENAMEの使い方を解説

    MySQLでテーブル名を変更したい場合、「ALTER TABLE」文と「RENAME」キーワードを組み合わせて使用します。この記事では、実際のコマンド例をもとに、テーブル名の変更手順をわかりやすく解説します。 1. 変更前のテーブルを作成する まず、CREATE文を使ってサンプル用のテーブルを作成します。ここでは従業員情報を管理する「Employee」というテーブルを作成しましょう。 mysql> CREATE table Employee -> ( -> EmpId int, -> EmpName varchar(200) -> );

  2. MySQLでテーブルの最後の10件のレコードを取得する方法

    MySQLでテーブルの末尾にある10行(最新の10件)を取得したい場合は、SELECT文とLIMIT句を組み合わせたサブクエリを利用します。この記事では、実際にテーブルを作成し、データを挿入しながら、最後の10件を取得するクエリの手順を具体的に解説します。 1. サンプルテーブルの作成 まず、動作確認用のテーブルを作成します。 mysql> create table Last10RecordsDemo -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected