ホームページ  >  記事  >  データベース  >  外部言語を使用せずに、MySQL 列の「;」区切り値を結合できますか?

外部言語を使用せずに、MySQL 列の「;」区切り値を結合できますか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-31 12:56:02725ブラウズ

Can I Join on ';' Separated Values in a MySQL Column Without Using External Languages?

Pure MySQL でこれを解決できますか? (列内の ';' で区切られた値の結合)

この疑問は、データが複数のテーブルにまたがっており、PHP などの外部言語を使用せずに単一のクエリで取得する必要がある場合に発生します。データは非正規化された方法で保存され、セミコロン (;) で区切られた 1 つの列内に複数の値が含まれます。

問題の説明:

この場合、user_resourceテーブルには、セミコロンで区切られたリソース ID のリストを含むリソース列があります:

user resources
user1 1;2;4
user2 2
user3 3;4

望ましい結果:

望ましい結果は、次のリストを含むテーブルを取得することです。各ユーザーと対応するリソース:

user data
user1 data1
user1 data2
user1 data4
user2 data2

解決策:

解決策には、user_resource テーブルから「正規化された」テーブルを作成し、リソース ID のリストを処理することが含まれます。行として変換し、正規化されたテーブルをリソース テーブルと結合します。この「正規化」は、COUNT_IN_SET 関数と VALUE_IN_SET 関数の組み合わせを使用して実現されます。

正規化されたテーブル:

生成された「正規化された」テーブルは次のようになります:

user resources resources_index resources_value
sampleuser 1;2;3 1 1
sampleuser 1;2;3 2 2
sampleuser 1;2;3 3 3
stacky 2 1 2
testuser 1;3 1 1
testuser 1;3 2 3

最終クエリ:

<code class="sql">SELECT user_resource.user, 
       resource.data

FROM user_resource 
     JOIN integerseries AS isequence 
       ON isequence.id <= COUNT_IN_SET(user_resource.resources, ';')
     JOIN resource 
       ON resource.id = VALUE_IN_SET(user_resource.resources, ';', isequence.id)      
ORDER BY
       user_resource.user,  resource.data</code>

使用される関数:

COUNT_IN_SET 関数と VALUE_IN_SET 関数は次のように使用されます。

  • COUNT_IN_SET: 指定された列内の文字で区切られた項目の数を返します。
  • VALUE_IN_SET: 区切りリストを次のように扱います。 1 から始まる配列で、特定の 'インデックス' の値を返します。

追加情報:

  • integerseries テーブルは、次の内容を含むテーブルです。 1 から特定の制限までの数値。「正規化された」行の生成に使用されます。
  • このソリューションは、提供されている特定の例のコンテキストだけでなく、MySQL 列内の区切りリスト項目を処理するための一般的なアプローチを提供します。 .

以上が外部言語を使用せずに、MySQL 列の「;」区切り値を結合できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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