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 関数は次のように使用されます。
追加情報:
以上が外部言語を使用せずに、MySQL 列の「;」区切り値を結合できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。