以下の編集者が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,',',''))+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,',',b.help_topic_id+1),',',-1) from tbl_name a join mysql.help_topic b on b.help_topic_id < (length(a.mSize) - length(replace(a.mSize,',',''))+1) order by a.ID;
以上がMySQL 列切り替えスキルと例の共有の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。