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

【MySQL】重複した値を除外して1つだけ取得するGROUP BYクエリの書き方

重複した値をスキップして1つだけ選択する方法

MySQLでは、GROUP BY句と集計関数MIN()を組み合わせることで、重複している値の中から1つだけを選択し、残りをスキップすることができます。

基本となる構文は以下の通りです。

SELECT MIN(カラム名1), カラム名2 FROM テーブル名 GROUP BY カラム名2;

この構文では、指定したカラム(カラム名2)の値ごとにグループ化し、その中で最小の値(カラム名1のMIN値)を取得します。これにより、重複する値は1行にまとめられます。

サンプルテーブルの作成

実際に動きを確認するため、テーブルを作成してみましょう。テーブル作成用のクエリは次の通りです。

mysql> create table doNotSelectDuplicateValuesDemo
    -> (
    -> User_Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> User_Name varchar(20)
    -> );
Query OK, 0 rows affected (0.78 sec)

テストデータの挿入

続いて、INSERTコマンドを使ってレコードを挿入します。意図的に「Carol」や「Bob」など同じ名前を複数回登録しています。

mysql> insert into doNotSelectDuplicateValuesDemo(User_Name) values('John');
Query OK, 1 row affected (0.15 sec)
mysql> insert into doNotSelectDuplicateValuesDemo(User_Name) values('Carol');
Query OK, 1 row affected (0.09 sec)
mysql> insert into doNotSelectDuplicateValuesDemo(User_Name) values('Carol');
Query OK, 1 row affected (0.17 sec)
mysql> insert into doNotSelectDuplicateValuesDemo(User_Name) values('Carol');
Query OK, 1 row affected (0.08 sec)
mysql> insert into doNotSelectDuplicateValuesDemo(User_Name) values('Sam');
Query OK, 1 row affected (0.28 sec)
mysql> insert into doNotSelectDuplicateValuesDemo(User_Name) values('Mike');
Query OK, 1 row affected (0.19 sec)
mysql> insert into doNotSelectDuplicateValuesDemo(User_Name) values('Bob');
Query OK, 1 row affected (0.16 sec)
mysql> insert into doNotSelectDuplicateValuesDemo(User_Name) values('David');
Query OK, 1 row affected (0.21 sec)
mysql> insert into doNotSelectDuplicateValuesDemo(User_Name) values('Maxwell');
Query OK, 1 row affected (0.13 sec)
mysql> insert into doNotSelectDuplicateValuesDemo(User_Name) values('Bob');
Query OK, 1 row affected (0.11 sec)
mysql> insert into doNotSelectDuplicateValuesDemo(User_Name) values('Ramit');
Query OK, 1 row affected (0.16 sec)

登録データの確認

SELECT文ですべてのレコードを表示してみます。

mysql> select *from doNotSelectDuplicateValuesDemo;

実行結果は以下の通りです。「Carol」が3件、「Bob」が2件と重複していることがわかります。

+---------+-----------+
| User_Id | User_Name |
+---------+-----------+
| 1 | John |
| 2 | Carol |
| 3 | Carol |
| 4 | Carol |
| 5 | Sam |
| 6 | Mike |
| 7 | Bob |
| 8 | David |
| 9 | Maxwell |
| 10 | Bob |
| 11 | Ramit |
+---------+-----------+
11 rows in set (0.00 sec)

重複を除外して取得するクエリ

それでは、重複した値をスキップして各値を1つだけ取得するクエリを実行してみましょう。

mysql> select min(User_Id),User_Name from doNotSelectDuplicateValuesDemo group by
User_Name;

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

+--------------+-----------+
| min(User_Id) | User_Name |
+--------------+-----------+
| 1 | John |
| 2 | Carol |
| 5 | Sam |
| 6 | Mike |
| 7 | Bob |
| 8 | David |
| 9 | Maxwell |
| 11 | Ramit |
+--------------+-----------+
8 rows in set (0.07 sec)

解説

元のテーブルには11件のレコードがありましたが、実行結果は8件になっています。「Carol」は3件から1件に、「Bob」は2件から1件にまとめられました。

GROUP BY User_Nameによってユーザー名ごとにグループ化され、MIN(User_Id)により各グループ内で最も小さいIDが返されています。たとえば「Carol」の場合、IDが2・3・4の3行がありますが、そのうち最小の「2」だけが出力されています。

なお、同様の目的にはDISTINCTキーワード(例:SELECT DISTINCT User_Name FROM テーブル名;)を使う方法もあります。DISTINCTは単純に一意な値の一覧を取得したい場合に便利ですが、IDなどの他カラムの値も一緒に取得したい場合は、今回のようにGROUP BYMIN()(またはMAX())を組み合わせる方法が有効です。

  1. MySQLで列の値ごとに「NO」の件数のみをカウントして返すクエリの書き方

    MySQLでは、SUM()関数と条件式を組み合わせることで、グループごとに特定の値(この例では「NO」)が出現した回数だけをカウントできます。ここでは、ENUM型のカラムを持つテーブルを例に、「NO」の件数のみを集計する方法を具体的な手順とともに解説します。 1. テーブルを作成する まず、サンプル用のテーブルを作成します。isTopperカラムはENUM型で、「YES」または「NO」のいずれかの値を持ちます。 mysql> create table DemoTable1829      (      Name varchar(

  2. MySQLでハイフン区切りの文字列値を1つの列から複数の列に分離して選択する方法

    ハイフンで区切られた文字列値を1つの列から複数の列に分離して取得したい場合、MySQLの SUBSTRING_INDEX() 関数を使用すると簡単に実現できます。ここでは、サンプルテーブルを使って具体的な手順を解説します。 サンプルテーブルの作成 まず、従業員情報を格納するテーブルを作成します。 mysql> create table DemoTable1962 ( EmployeeInformation text ); Query OK, 0 rows affected (0.00 sec) データの挿入 次に、INSERT文を使って「ID-名前-年齢」の形