MySQLでMAX()関数の値に対応するレコードを取得する方法【サブクエリ活用】
SQLで最大値(MAX)が含まれる行の、他のカラムの値も一緒に取得したい場面はよくあります。例えば「最も金額が高い商品のIDを知りたい」といったケースです。このような場合には、サブクエリ(副問い合わせ)と集計関数MAX()を組み合わせることで実現できます。
この記事では、実際にテーブルを作成しながら、その手順をわかりやすく解説します。
1. サンプルテーブルの作成
まず、商品IDと商品金額を格納するテーブルを作成します。
mysql> create table DemoTable
-> (
-> ProductId int,
-> ProductAmount int
-> );
Query OK, 0 rows affected (0.78 sec)
2. テストデータの挿入
次に、INSERT文を使ってサンプルデータを登録します。
mysql> insert into DemoTable values(1001,7895);
Query OK, 1 row affected (0.32 sec)
mysql> insert into DemoTable values(1003,8903);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values(1010,7690);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values(2010,8450);
Query OK, 1 row affected (0.12 sec)
3. 登録データの確認
SELECT文ですべてのレコードを表示してみましょう。
mysql> select *from DemoTable;
実行結果は以下のとおりです。
+-----------+---------------+
| ProductId | ProductAmount |
+-----------+---------------+
| 1001 | 7895 |
| 1003 | 8903 |
| 1010 | 7690 |
| 2010 | 8450 |
+-----------+---------------+
4 rows in set (0.00 sec)
4. MAX()の値に対応するレコードを取得するクエリ
ここが本題です。WHERE句の中でサブクエリを使用し、「ProductAmountがテーブル内の最大値と一致する行」を抽出します。
mysql> select *from DemoTable
-> where ProductAmount=( select max(ProductAmount) from DemoTable);
5. 実行結果
このクエリを実行すると、以下の出力が得られます。
+-----------+---------------+
| ProductId | ProductAmount |
+-----------+---------------+
| 1003 | 8903 |
+-----------+---------------+
1 row in set (0.05 sec)
解説:なぜサブクエリが必要なのか
集計関数であるMAX()は、GROUP BYなどでグループ化した場合を除き、WHERE句の中で直接使用することができません。そのため、まずサブクエリでテーブル全体の最大値(この例では8903)を求め、その値と一致する行を外側のクエリで取得するという流れになります。
この手法を使えば、「最高額の商品ID」「最新の日付に該当するレコード」など、最大値・最小値に関連する情報を柔軟に取り出すことができます。なお、同額の最大値が複数存在する場合は、該当するすべての行が返される点にも注意してください。
-
Windows 10で印刷スプーラー(Print Spooler)を再起動する方法
ポイント「サービス」アプリを開き、「Print Spooler」を選択します。右クリックで「停止」を選び、その後もう一度右クリックして「開始」を選択すると、サービスが再起動されます。または、タスクマネージャーを開き、「サービス」タブで「Spooler」を選択します。右クリックメニューから「開始」「停止」「再起動」を選択できます。印刷キューを確認するには、「設定」>「デバイス」>「プリンターとスキャナー」に移動し、一覧からプリンターを選択して「キューを開く」をクリックします。この記事では、Windows 10で印刷スプーラーを簡単な手順で再起動する方法をご紹介します。Windows
-
MySQL WorkbenchでタイムスタンプフィールドにNOW()を適用する方法
はじめにMySQLでは、NOW()関数を使うことで、レコード挿入時点の現在日時をタイムスタンプ型のカラムに簡単に設定できます。この記事では、MySQL Workbench上でタイムスタンプフィールドにNOW()を適用する具体的な手順を、サンプルコード付きで解説します。1. テーブルを作成するまず、タイムスタンプ型のカラムを持つテーブルを作成します。create table DemoTable( Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, ShippingDat