ホームページ  >  記事  >  データベース  >  MySQL 列切り替えスキルと例の共有

MySQL 列切り替えスキルと例の共有

黄舟
黄舟オリジナル
2017-03-25 13:28:571415ブラウズ

以下の編集者がmysqlの転職のヒントに関する記事をお届けします(シェア)。編集者はこれがとても良いものだと思ったので、皆さんの参考として今から共有します。編集者をフォローして、一緒に見てみましょう

前書き:

歴史的理由またはパフォーマンス上の理由により、多くのビジネス テーブルは、第一正規形に違反する設計パターンを使用しています。つまり、複数の attribute 値が同じ列に格納されます (具体的な構造については、以下の表を参照してください)。

このモードでは、アプリケーションは多くの場合、区切り文字に基づいて列を分割し、列変換の結果を取得する必要があります。

テーブルデータ:

ID Value
1 tiny,small,big
2 small,medium
3 小さい、大きい

期待される結果:

ID
1 小さい
1 小さい
1 大きい
2
2
3 小さい
3 big

テキスト:

#需要处理的表
create table tbl_name (ID int ,mSize varchar(100));
insert into tbl_name values (1,'tiny,small,big');
insert into tbl_name values (2,'small,medium');
insert into tbl_name values (3,'tiny,big');

#用于循环的自增表
create table incre_table (AutoIncreID int);
insert into incre_table values (1);
insert into incre_table values (2);
insert into incre_table values (3);
select a.ID,substring_index(substring_index(a.mSize,',',b.AutoIncreID),',',-1) 
from 
tbl_name a
join
incre_table b
on b.AutoIncreID <= (length(a.mSize) - length(replace(a.mSize,&#39;,&#39;,&#39;&#39;))+1)
order by a.ID;

原理分析:

この結合の最も基本的な原理はデカルト積です。これがループの実装方法です。

以下は具体的な問題分析です:

length(a.Size) - length(replace(a.mSize,',',''))+1 は、カンマで分割した後、列の所有権 値の数 (以下、n

と呼びます) 結合プロセスの疑似コード:

ID に従ってループ

{
判断:i 是否 <= n
{

i 番目のカンマに最も近いデータ、つまり substring_index( substring_index(a.mSize,', ',b.ID),',',-1)

i = i +1
}
ID = ID +1
}

概要:

このメソッドの欠点は、連続列を持つ別のテーブルが必要なことです (ここではincre_table です)。そして、連続する数列の最大値は、除算を満たす値の数より大きくなければなりません。

たとえば、行の mSize に 100 個のカンマ区切り値がある場合、incre_table には少なくとも 100 個の連続した行が必要です。

もちろん、mysql 内で利用できる既製の連続番号リストもあります。たとえば、mysql.help_topic: help_topic_id には合計 504 の値があり、通常はほとんどのニーズを満たすことができます。

次のように書き直されました:

select a.ID,substring_index(substring_index(a.mSize,&#39;,&#39;,b.help_topic_id+1),&#39;,&#39;,-1) 
from 
tbl_name a
join
mysql.help_topic b
on b.help_topic_id < (length(a.mSize) - length(replace(a.mSize,&#39;,&#39;,&#39;&#39;))+1)
order by a.ID;

以上がMySQL 列切り替えスキルと例の共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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