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

MySQLで2つの列から重複しない値(DISTINCT)を抽出する方法

はじめに

MySQLで2つの列をまたいで重複しない値(DISTINCTな値)を取得したい場合、least()関数とgreatest()関数を組み合わせて使うと便利です。この記事では、実際にテーブルを作成し、サンプルデータを使ってその方法を解説します。

テーブルの作成

まず、2つの列を持つテーブルを作成しましょう。

mysql> create table SelectDistinctTwoColumns
-> (
-> StudentId int,
-> EmployeeId int
-> );
Query OK, 0 rows affected (0.60 sec)

ここでは「StudentId(学生ID)」と「EmployeeId(従業員ID)」という2つのint型の列を持つテーブルを作成しました。

レコードの挿入

次に、テーブルにレコードを挿入します。意図的に重複する組み合わせや、列の値が入れ替わった組み合わせも含めています。

mysql> insert into SelectDistinctTwoColumns values(100,101);
Query OK, 1 row affected (0.39 sec)

mysql> insert into SelectDistinctTwoColumns values(102,103);
Query OK, 1 row affected (0.13 sec)

mysql> insert into SelectDistinctTwoColumns values(104,105);
Query OK, 1 row affected (0.18 sec)

mysql> insert into SelectDistinctTwoColumns values(100,101);
Query OK, 1 row affected (0.14 sec)

mysql> insert into SelectDistinctTwoColumns values(102,103);
Query OK, 1 row affected (0.12 sec)

mysql> insert into SelectDistinctTwoColumns values(106,107);
Query OK, 1 row affected (0.36 sec)

mysql> insert into SelectDistinctTwoColumns values(104,105);
Query OK, 1 row affected (0.17 sec)

mysql> insert into SelectDistinctTwoColumns values(105,104);
Query OK, 1 row affected (0.35 sec)

登録済みレコードの確認

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

mysql> select *from SelectDistinctTwoColumns;

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

+-----------+------------+
| StudentId | EmployeeId |
+-----------+------------+
| 100 | 101 |
| 102 | 103 |
| 104 | 105 |
| 100 | 101 |
| 102 | 103 |
| 106 | 107 |
| 104 | 105 |
| 105 | 104 |
+-----------+------------+
8 rows in set (0.00 sec)

出力結果を見ると、両列にまたがって重複した値が含まれていることがわかります。特に注目すべきは最後の行で、「(104, 105)」と「(105, 104)」は順序が違うだけで同じペアとして扱いたいケースです。

DISTINCTな値を取得するクエリ

そこで、least()関数とgreatest()関数を使って、2つの列の値を常に小さい方・大きい方の順に揃えてから重複を排除します。

mysql> select distinct least(StudentId, EmployeeId) as FirstColumn,
-> greatest(StudentId, EmployeeId) as SecondColumn from SelectDistinctTwoColumns;

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

+-------------+--------------+
| FirstColumn | SecondColumn |
+-------------+--------------+
| 100 | 101 |
| 102 | 103 |
| 104 | 105 |
| 106 | 107 |
+-------------+--------------+
4 rows in set (0.00 sec)

仕組みの解説

least()関数は引数の中で最も小さい値を、greatest()関数は最も大きい値をそれぞれ返します。この2つを組み合わせることで、元の行での列の順序に関係なく、必ず「小さい値が先、大きい値が後」という正規化された形になります。その結果、「(104, 105)」と「(105, 104)」のような入れ替わりペアも同じ値として認識され、DISTINCTによって正しく重複排除されるのです。

この手法は、無向グラフのエッジ情報や、ペア関係を保存するテーブルなど、順序が意味を持たない2列の組み合わせからユニークなペアを抽出したい場合に非常に役立ちます。

  1. MySQLでテーブルの値からランダムに2件のレコードを取得する方法

    MySQLでランダムにレコードを抽出するには、ORDER BY RAND()を使用します。さらに、取得する件数を2件に限定したい場合は、LIMIT 2を組み合わせることで実現できます。この記事では、実際にテーブルを作成し、ランダムに2つの値を取得する手順を具体的な例とともに解説します。サンプルテーブルの作成まず、質問文を格納するテーブルを作成しましょう。mysql> create table DemoTable1815 ( Question text ); Query OK, 0 rows affected (0.00 sec)テストデータの挿入次に、INSERT

  2. MySQLでテーブルの重複を除いたレコードから平均値を取得するクエリの書き方

    MySQLで平均値を求めるには AVG() 関数を使用します。さらに DISTINCT と組み合わせることで、重複しているレコードを除外した状態で平均を計算することができます。この記事では、実際にサンプルテーブルを作成しながら、個別(ユニーク)なレコードから平均値を取得する方法を解説します。サンプルテーブルの作成まず、以下のクエリでテーブルを作成します。mysql> create table DemoTable1934 ( StudentName varchar(20), StudentMarks int ); Query OK, 0 rows affec