MySQLで1つの列だけから重複しない値を取得する方法(MAX関数とGROUP BY活用)
はじめに
MySQLでテーブル全体ではなく、特定の1列だけに基づいて重複しない(ユニークな)値を取得したい場合があります。そんなときは、集計関数 MAX() と GROUP BY を組み合わせることで実現できます。
この記事では、実際にサンプルテーブルを作成し、1つの列のみを対象に一意な値を抽出する手順をわかりやすく解説します。
サンプルテーブルの作成
まず、学生IDと学生名を持つテーブルを作成します。
mysql> create table distinctFromOneColumn
-> (
-> StudentId int,
-> StudentName varchar(100)
-> );
Query OK, 0 rows affected (0.77 sec)
レコードの挿入
次に、INSERTコマンドを使ってテーブルにデータを挿入します。あえて同じStudentIdが重複するデータを登録しています。
mysql> insert into distinctFromOneColumn values(1001,'John');
Query OK, 1 row affected (0.15 sec)
mysql> insert into distinctFromOneColumn values(1002,'Carol');
Query OK, 1 row affected (0.15 sec)
mysql> insert into distinctFromOneColumn values(1001,'Sam');
Query OK, 1 row affected (0.15 sec)
mysql> insert into distinctFromOneColumn values(1001,'David');
Query OK, 1 row affected (0.16 sec)
mysql> insert into distinctFromOneColumn values(1002,'Ramit');
Query OK, 1 row affected (0.15 sec)
mysql> insert into distinctFromOneColumn values(1003,'Bob');
Query OK, 1 row affected (0.21 sec)
登録済みデータの確認
SELECT文ですべてのレコードを表示してみましょう。
mysql> select * from distinctFromOneColumn;
実行結果は以下のとおりです。StudentIdに「1001」と「1002」が重複して登録されていることが確認できます。
+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
| 1001 | John |
| 1002 | Carol |
| 1001 | Sam |
| 1001 | David |
| 1002 | Ramit |
| 1003 | Bob |
+-----------+-------------+
6 rows in set (0.00 sec)
1つの列のみから一意な値を取得するクエリ
ここで本題です。StudentIdごとにグループ化し、その中で最大のStudentNameを取得することで、StudentId単位の一意な結果を得られます。
mysql> select StudentId,MAX(StudentName) AS StudentName
-> from distinctFromOneColumn
-> group by StudentId;
実行結果は以下のとおりです。
+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
| 1001 | Sam |
| 1002 | Ramit |
| 1003 | Bob |
+-----------+-------------+
3 rows in set (0.00 sec)
解説とポイント
GROUP BY StudentIdにより、同じStudentIdの行が1つのグループにまとめられます。MAX(StudentName)は各グループ内で辞書順に最も大きい名前を返します。上記の例では「1001」グループの中から「Sam」が選ばれています。- 最小値を取得したい場合は
MIN()に置き換えるだけでOKです。
このように、MAX()(または MIN())と GROUP BY を組み合わせることで、特定の1列を基準にした重複排除を簡単に実現できます。データの件数が多い場合でもインデックスを適切に設定すれば、効率的に処理できる点もメリットです。
-
MySQLでテーブルの重複を除いたレコードから平均値を取得するクエリの書き方
MySQLで平均値を求めるには AVG() 関数を使用します。さらに DISTINCT と組み合わせることで、重複しているレコードを除外した状態で平均を計算することができます。この記事では、実際にサンプルテーブルを作成しながら、個別(ユニーク)なレコードから平均値を取得する方法を解説します。サンプルテーブルの作成まず、以下のクエリでテーブルを作成します。mysql> create table DemoTable1934 ( StudentName varchar(20), StudentMarks int ); Query OK, 0 rows affec
-
MySQLで値が「0」の場合に別の列から値を取得する方法
MySQLで値が「0」の場合に別の列から値を取得する方法MySQLでは、IF()関数を使用することで、特定の列の値が「0」だった場合に、別の列の値を代わりに取得できます。条件分岐を1つのクエリ内で簡単に実現できる便利な関数です。IF()関数の基本構文select IF(yourColumnName1=0,yourColumnName2,yourColumnName1) as anyAliasName from yourTableName;この構文では、最初の列の値が「0」であれば2番目の列の値を返し、「0」以外であれば最初の列の値をそのまま返します。サンプルテーブルの作成まず、動作確認用のテー