ホームページ >データベース >mysql チュートリアル >SQL を使用してカンマ区切り値でテーブルを結合するにはどうすればよいですか?

SQL を使用してカンマ区切り値でテーブルを結合するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-14 10:04:10241ブラウズ

How to Join Tables with Comma-Separated Values Using SQL?

カンマ区切り値を使用したテーブルの結合: 完全ガイド

データベース テーブルには、特定の列にカンマ区切り値が含まれることがよくあります。各値を対応する行に関連付ける必要があるため、データをクエリするときに問題が発生します。一般的なシナリオの 1 つは、一方の列にもう一方のテーブルを参照するカンマ区切り値が含まれる 2 つのテーブルを結合することです。

次の例を考えてみましょう:

Notes テーブル

nid forDepts
1 1,2,4
2 4,5

ポジションテーブル

id name
1 Executive
2 Corp Admin
3 Sales
4 Art
5 Marketing

目標は、Notes テーブルの 'forDepts' 列を、Positions テーブルの対応する部門名に関連付けることです。目的の出力は次のようになります。

nid DepartmentName
1 Executive, Corp Admin, Art
2 Art, Marketing

データベース構造を変更せずに、SQL 関数の組み合わせを使用してこれを実現できます。

FIND_IN_SET と GROUP_CONCAT を使用する

FIND_IN_SET 関数と GROUP_CONCAT 関数を組み合わせて使用​​できます各 'forDepts' 値の部門名を抽出して集計するには:

SELECT  a.nid,
        GROUP_CONCAT(b.name ORDER BY b.id) DepartmentName
FROM    Notes a
        INNER JOIN Positions b
            ON FIND_IN_SET(b.id, a.forDepts) > 0
GROUP   BY a.nid

仕組み

  • FIND_IN_SET 関数は、指定された値が存在するかどうかを確認します。カンマ区切りの文字列内で指定します。この場合、Notes テーブルの 'forDepts' 値に Positions テーブルの部門の ID が含まれているかどうかを判断するために使用されます。
  • INNER JOIN 句は、Notes テーブルと Positions テーブルの行と一致します。 FIND_IN_SET 条件が true です。
  • GROUP_CONCAT 関数は、Notes テーブル内の各「nid」に一致する部門名を集計します。 ORDER BY 句により、名前が ID に基づいて昇順に並べ替えられます。

Result

クエリの出力は、目的のテーブルになります。 「nid」列と、対応するカンマ区切りの「DepartmentName」を結合したもの

結論

FIND_IN_SET 関数と GROUP_CONCAT 関数を活用すると、カンマ区切りの値を使用して 2 つのテーブルを効果的に結合でき、テーブル間でデータを抽出して集計できるようになります。データベース構造が正規化されていない場合でも。この手法は、Excel などの他のアプリケーションにデータをエクスポートする場合に特に役立ちます。

以上がSQL を使用してカンマ区切り値でテーブルを結合するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。