MySQLで最大IDの行を条件付きで更新するUPDATEクエリの書き方
MySQL UPDATEクエリで最大IDのレコードを更新する方法
MySQLでは、特定のカラムが指定した値と一致する行の中から、最も大きなIDを持つレコードだけを更新したいケースがあります。このような場合は、ORDER BY句とLIMIT 1を組み合わせることで実現できます。
基本構文
update yourTableName set yourColumnName1=yourValue where yourColumnName2=yourValue order by yourIdColumnName DESC LIMIT 1;
この構文では、WHERE句で対象となる行を絞り込み、ORDER BY ... DESCでIDの降順に並べ替え、LIMIT 1によって先頭(=最大ID)の1行のみを更新します。
サンプルテーブルの作成
実際に動作を確認するため、まずテーブルを作成しましょう。テーブル作成のクエリは以下の通りです。
mysql> create table UpdateWithHighestDemo
-> (
-> UserId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> UserStatus tinyint,
-> UserRank int
-> );
Query OK, 0 rows affected (0.61 sec)ここでは、自動採番されるUserIdを主キーとし、ユーザーの状態を表すUserStatus、ランクを表すUserRankという3つのカラムを持つテーブルを作成しました。
テストデータの挿入
次に、INSERT文を使っていくつかのレコードを挿入します。
mysql> insert into UpdateWithHighestDemo(UserStatus,UserRank) values(1,78); Query OK, 1 row affected (0.12 sec) mysql> insert into UpdateWithHighestDemo(UserStatus,UserRank) values(0,118); Query OK, 1 row affected (0.18 sec) mysql> insert into UpdateWithHighestDemo(UserStatus,UserRank) values(1,223); Query OK, 1 row affected (0.62 sec) mysql> insert into UpdateWithHighestDemo(UserStatus,UserRank) values(1,225); Query OK, 1 row affected (0.12 sec) mysql> insert into UpdateWithHighestDemo(UserStatus,UserRank) values(0,227); Query OK, 1 row affected (0.14 sec) mysql> insert into UpdateWithHighestDemo(UserStatus,UserRank) values(0,230); Query OK, 1 row affected (0.17 sec)
登録データの確認
SELECT文ですべてのレコードを表示して確認してみましょう。
mysql> select *from UpdateWithHighestDemo;
実行結果は以下の通りです。
+--------+------------+----------+ | UserId | UserStatus | UserRank | +--------+------------+----------+ | 1 | 1 | 78 | | 2 | 0 | 118 | | 3 | 1 | 223 | | 4 | 1 | 225 | | 5 | 0 | 227 | | 6 | 0 | 230 | +--------+------------+----------+ 6 rows in set (0.00 sec)
WHERE句付きで特定の行を更新する
まずは、UserRank=230である行のUserStatusを1に更新してみます。更新用のクエリは以下の通りです。
mysql> update UpdateWithHighestDemo -> set UserStatus=1 where UserRank=230 order by UserId DESC LIMIT 1; Query OK, 1 row affected (0.19 sec) Rows matched: 1 Changed: 1 Warnings: 0
SELECT文で結果を確認してみましょう。
mysql> select *from UpdateWithHighestDemo;
実行結果は以下の通りです。
+--------+------------+----------+ | UserId | UserStatus | UserRank | +--------+------------+----------+ | 1 | 1 | 78 | | 2 | 0 | 118 | | 3 | 1 | 223 | | 4 | 1 | 225 | | 5 | 0 | 227 | | 6 | 1 | 230 | +--------+------------+----------+ 6 rows in set (0.00 sec)
UserId=6(この時点での最大ID)の行のUserStatusが0から1に更新されていることがわかります。
最大IDの行だけを更新する
次に、「最も大きなIDを持つ行」を更新する方法を見ていきましょう。ここで活躍するのがORDER BY句です。上記の出力例では、最大のUserIdは6で、そのUserStatusは1になっています。
この最大IDの行に対して、UserStatusを0に更新してみます。クエリは以下の通りです。
mysql> update UpdateWithHighestDemo -> set UserStatus=0 order by UserId DESC LIMIT 1; Query OK, 1 row affected (0.18 sec) Rows matched: 1 Changed: 1 Warnings: 0
SELECT文でテーブルの内容を確認します。
mysql> select *from UpdateWithHighestDemo; +--------+------------+----------+ | UserId | UserStatus | UserRank | +--------+------------+----------+ | 1 | 1 | 78 | | 2 | 0 | 118 | | 3 | 1 | 223 | | 4 | 1 | 225 | | 5 | 0 | 227 | | 6 | 0 | 230 | +--------+------------+----------+ 6 rows in set (0.00 sec)
まとめ
MySQLで「条件に一致する行のうち最大IDのもの」または「単純に最大IDの行」だけを更新したい場合は、UPDATE文にORDER BY IDカラム DESC LIMIT 1を付けるだけで簡単に実現できます。WHERE句との組み合わせによって、より柔軟な条件指定も可能なので、ぜひ活用してみてください。
-
MySQLでGROUP BYのように特定の1行だけ更新する方法|ORDER BYとLIMITを活用したUPDATE文の書き方
MySQLでは、UPDATE文の中でGROUP BYを直接使用することができません。しかし、「同じ値を持つ複数のレコードの中から、最初の1行だけを更新したい」というケースは実際の開発でよく発生します。 そんなときに役立つのが、ORDER BYとLIMITを組み合わせたUPDATE文です。この記事では、サンプルテーブルを使いながら、その具体的な手順をわかりやすく解説します。 1. サンプルテーブルを作成する まず、従業員情報を格納するテーブル「DemoTable2018」を作成します。テーブルには、自動採番される主キー「EmployeeId」、従業員名「EmployeeName」、給与「Emp
-
MySQLでカスタム変数を使ってテーブルを更新する方法【実例付き】
MySQLでは、ユーザー定義変数(カスタム変数)を活用することで、UPDATE文の実行時に値を動的に変化させながらレコードを更新できます。本記事では、実際のコード例を通じて、カスタム変数を使った更新クエリの書き方をわかりやすく解説します。1. サンプルテーブルの作成まず、動作確認用のテーブルを作成します。mysql> create table DemoTable2027 -> ( -> UserId int -> );Query OK, 0 rows affected (0.65 sec)2. テストデータの挿入次に、INSERT文を使ってサンプルデー