MYSQL クエリの 1 対多のデータ テーブルの関連付け、重複データの処理方法

MySQL では、1 対多のデー​​タ テーブル関連付けクエリを実行すると、結果に重複データが発生することがあります。これは、関連付けられた複数のサブテーブル レコードとメイン テーブル レコードのデカルト積が原因で、結果が重複してしまいます。この状況に対処するには、次のいずれかの方法を使用できます。

  • DISTINCT キーワードを使用する: クエリ ステートメントで DISTINCT キーワードを使用すると、重複レコードを削除できます。例えば:
SELECT DISTINCT t1.column1, t1.column2, t2.column3
FROM table1 t1
JOIN table2 t2 ON t1.id = t2.table1_id;
  • サブクエリまたはネストされたクエリを使用する: サブクエリまたはネストされたクエリを使用すると、関連するサブテーブルのデータをメイン クエリにマージして、結果の重複を避けることができます。例えば:
SELECT t1.column1, t1.column2, (
    SELECT GROUP_CONCAT(t2.column3)
    FROM table2 t2
    WHERE t2.table1_id = t1.id
) AS child_data
FROM table1 t1;

上記のクエリは、サブクエリを使用してサブテーブルのデータを取得し、GROUP_CONCAT 関数を通じて複数のサブテーブル レコードを 1 つの文字列に結合します。

  • GROUP BY 句を使用する: メイン テーブルのレコードごとにグループ化する必要がある場合は、GROUP BY 句を使用できます。これにより、重複したサブテーブル データを 1 つのレコードに結合できます。例えば:
SELECT t1.column1, t1.column2, GROUP_CONCAT(t2.column3)
FROM table1 t1
JOIN table2 t2 ON t1.id = t2.table1_id
GROUP BY t1.id;

上記のクエリでは、GROUP BY 句を使用してメイン テーブルの ID でグループ化し、GROUP_CONCAT 関数を使用して複数のサブテーブル レコードを 1 つの文字列に結合します。
DISTINCT キーワード、サブクエリまたはネストされたクエリ、および GROUP BY 句の使用に加えて、重複データを処理するための他のオプションがあります。


  • さまざまなタイプの JOIN 句を使用する: MySQL には、INNER JOIN、LEFT JOIN、RIGHT JOIN など、さまざまなタイプの JOIN 操作があります。特定のデータ テーブルの関係とクエリの要件に従って、適切な JOIN タイプを選択して、結果セットに重複データが表示されないようにします。
  • サブクエリを使用して重複を排除する: 重複データは、サブクエリと集計関数 (MAX、MIN など) を使用して削除できます。例えば:
SELECT t1.column1, t1.column2, t2.column3
FROM table1 t1
JOIN (
    SELECT DISTINCT table1_id, column3
    FROM table2
) t2 ON t1.id = t2.table1_id;

上記のクエリでは、サブクエリは DISTINCT キーワードを使用してサブテーブル内の重複データを削除し、それをメイン テーブルに関連付けます。

  • 一時テーブルまたはテーブル変数を使用する: 一時テーブルまたはテーブル変数を使用して中間結果を保存し、中間結果を処理して重複データを削除できます。このアプローチでは、複数のクエリ ステートメントの使用が必要になる場合があり、追加の操作がいくつか追加されます。
  • アプリケーションで重複データを処理する: 重複データの問題がデータベース クエリで解決できない場合は、アプリケーションで処理できます。アプリケーションのデータ構造 (コレクションなど) とアルゴリズムを使用して、クエリ結果の重複を排除します。
  • ウィンドウ関数を使用する (ウィンドウ関数): MySQL 8.0 以降のバージョンはウィンドウ関数をサポートしており、ウィンドウ関数を使用して繰り返しデータを処理できます。ROW_NUMBER() 関数または他のウィンドウ関数を使用して、結果セットをグループ化、並べ替え、およびフィルター処理して、目的の一意のレコードを取得します。

  • DISTINCT ON 構文を使用する (特定のデータベースにのみ適用可能): 一部のデータベース (PostgreSQL など)は、指定された列に従って結果セットを重複排除できるDISTINCT ON 構文をサポートしています。ただし、この構文の可用性と構文の違いはデータベースによって異なる場合があることに注意してください。

おすすめ

転載: blog.csdn.net/yuanchengfu0910/article/details/131209626