MySQLのDISTINCTで重複データを削除して取得する方法!

データベースで重複したデータが多く、重複したデータは1つにまとめて表示させたいということがあります。DISTINCTを使うことで重複したデータは取り除いて取得できます。この記事ではMySQLのDISTINCTで重複データを削除して取得する方法を紹介しています。

コンテンツ [表示]

  1. 1MySQLのDISTINCTとは?
  2. 2MySQLのDISTINCTの使い方
  3. 2.1カラムが1つの場合
  4. 2.2カラムが複数の場合

データベースを扱う際に重複したデータが多いとデータが見づらく、重複したデータを削除して1つ(ユニーク)の状態で表示したいということはよくあります。

そこでMySQLでは重複したデータを削除したい場合にはDISTINCTを使います。

MySQLのDISTINCTとは?

DISTINCTは重複したデータを取り除くことができます。

重複したデータを除外した重複なしの状態で表示を行います。そのため、データベース上のデータが実際に削除されたりするわけではないので注意してください。

MySQLのDISTINCTの使い方

それではDISINCTの使い方を見ていきましょう。

カラムが1つの場合

まずはusersテーブルを用意して、下記のようなデータを追加しました。

mysql> SHOW TABLES;
+------------------+
| Tables_in_testdb |
+------------------+
| users            |
+------------------+

mysql> DESC users;
+------------+-------------+------+-----+---------+----------------+
| Field      | Type        | Null | Key | Default | Extra          |
+------------+-------------+------+-----+---------+----------------+
| id         | int(11)     | NO   | PRI | NULL    | auto_increment |
| name       | varchar(10) | YES  |     | NULL    |                |
| email      | varchar(30) | YES  |     | NULL    |                |
| age        | int(11)     | YES  |     | NULL    |                |
| created_at | datetime    | YES  |     | NULL    |                |
| updated_at | datetime    | YES  |     | NULL    |                |
+------------+-------------+------+-----+---------+----------------+

mysql> SELECT * FROM users;
+----+--------+--------------------+------+------------+------------+
| id | name   | email              | age  | created_at | updated_at |
+----+--------+--------------------+------+------------+------------+
|  1 | taro   | taro@example.com   |   22 | NULL       | NULL       |
|  2 | hanako | hanako@example.com |   20 | NULL       | NULL       |
|  3 | jiro   | jiro@example.com   |   34 | NULL       | NULL       |
|  4 | taro   | taro2@example.com  |   29 | NULL       | NULL       |
|  5 | jiro   | jiro2@example.com  |   18 | NULL       | NULL       |
|  6 | yuriko | yuriko@example.com |   10 | NULL       | NULL       |
+----+--------+--------------------+------+------------+------------+

ユニークな値を持つ自動増分キーidカラムを設定しているのでレコードの全体の重複を避けることはできていますが、nameカラムの値が重複しているレコードがいくつか見ることができますね。

分かりやすいようにnameカラムだけ抽出してみましょう。

mysql> SELECT name FROM users;
+--------+
| name   |
+--------+
| taro   |
| hanako |
| jiro   |
| taro   |
| jiro   |
| yuriko |
+--------+

tarojiroが複数存在しているがわかります。この重複した値をDISTINCTで取り除いた状態で表示してみたいと思います。

mysql> SELECT DISTINCT name FROM users;
+--------+
| name   |
+--------+
| taro   |
| hanako |
| jiro   |
| yuriko |
+--------+

DISTINCTを使うことで重複した値をまとめることができました。

使い方はSELECT句の後にDISTINCTを記述することで重複した値はまとめて、ユニークな値のみを表示するようにすることが出来ます。

カラムが複数の場合

次はDISTINCTを用いて重複した値を取り除くとき、複数カラムを指定した場合にはどうなるかを見ていきましょう。

productテーブルを作成して、下記のようにデータを追加しました。

mysql> SHOW TABLES;
+------------------+
| Tables_in_testdb |
+------------------+
| product          |
| users            |
+------------------+

mysql> DESC product;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name  | varchar(10) | YES  |     | NULL    |       |
| color | varchar(10) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+

mysql> SELECT * FROM product;
+------+--------+
| name | color  |
+------+--------+
| pen  | red    |
| book | black  |
| pen  | blue   |
| pen  | red    |
| pen  | orange |
| book | white  |
| book | black  |
+------+--------+

早速DISTINCTnameカラムとcolorカラムを指定してみましょう。

mysql> SELECT DISTINCT name, color FROM product;
+------+--------+
| name | color  |
+------+--------+
| pen  | red    |
| book | black  |
| pen  | blue   |
| pen  | orange |
| book | white  |
+------+--------+

複数カラムで指定した場合、複数カラムの値全てが同じ値のレコードが重複して存在した場合それらのレコードは1つにまとめられます。

今回でいうとnameカラムとcolorカラムがどちらも同じ値のレコードは1つにまとめられています。nameカラムが同じpenという値でもcolorカラムの値が違うものは別のレコードとして扱われ、どちらのレコードも表示されます。

GeekHive採用サイト

関連記事