<noscript id="eassg"><table id="eassg"></table></noscript>
  • <strike id="eassg"><s id="eassg"></s></strike>
  • <ul id="eassg"></ul>
    注冊|登錄

    聯系電話:024-31891684  13390130939
    沈陽軟件公司--沈陽軟件定制

    沈陽軟件開發_沈陽軟件公司_沈陽軟件定制/軟件/最新技術

    Latest technology最新技術

    MySQL逗號分割字段的行列轉換技巧

    瀏覽量:2749

    前言:

    由于很多業務表因為歷史原因或者性能原因,都使用了違反第一范式的設計模式。即同一個列中存儲了多個屬性值(具體結構見下表)。

    這種模式下,應用常常需要將這個列依據分隔符進行分割,并得到列轉行的結果。

    表數據:

     

    ID 

    Value

    1

    tiny,small,big

    2

    small,medium

    3

    tiny,big

    期望得到結果:

     

    ID

    Value

    1

    tiny

    1

    small

    1

    big

    2

    small

    2

    medium

    3

    tiny

    3

    big

    正文:

     

    #需要處理的表

    createtable tbl_name (ID int ,mSize varchar(100));

    insertinto tbl_name values (1,'tiny,small,big');

    insertinto tbl_name values (2,'small,medium');

    insertinto tbl_name values (3,'tiny,big');

     

    #用于循環的自增表

    createtable incre_table (AutoIncreID int);

    insertinto incre_table values (1);

    insertinto incre_table values (2);

    insertinto incre_table values (3);

     

     

    selecta.ID,substring_index(substring_index(a.mSize,',',b.AutoIncreID),',',-1)

    from

    tbl_name a

    join

    incre_table b

    onb.AutoIncreID <= (length(a.mSize) - length(replace(a.mSize,',',''))+1)

    orderby a.ID;

     

    原理分析:

    這個join最基本原理是笛卡爾積。通過這個方式來實現循環。

    以下是具體問題分析:

    length(a.Size) - length(replace(a.mSize,',',''))+1 表示了,按照逗號分割后,改列擁有的數值數量,下面簡稱n

    join過程的偽代碼:

    根據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個數值,一般能滿足于大部分需求了。

    改寫后如下:

     

    selecta.ID,substring_index(substring_index(a.mSize,',',b.help_topic_id+1),',',-1)

    from

    tbl_name a

    join

    mysql.help_topic b

    onb.help_topic_id < (length(a.mSize) - length(replace(a.mSize,',',''))+1)

    orderby a.ID;

    沈陽團購網|營口網站制作|沈陽軟件公司|軟件定制|網站建設|加盟易勢|提交問題

    亚洲AV成人无码久久精品老人| 亚洲国产精品一区二区第四页| 亚洲国产精品综合一区在线| 精品一区二区久久| 国产91精品一区二区麻豆亚洲| 日韩人妻不卡一区二区三区| 精品国产一区二区二三区在线观看| 日本亚洲精品色婷婷在线影院| 亚洲AV第一页国产精品| 久久99精品综合国产首页| 国产午夜精品一区二区三区小说| 亚洲精品人成无码中文毛片| 竹菊影视欧美日韩一区二区三区四区五区| 国产精品成人va在线播放| 精品国产一区二区三区免费看| 久久精品无码中文字幕| 在线精品自偷自拍无码中文| 国产精品亚洲精品观看不卡| 精品国产乱码久久久久久人妻| 久久水蜜桃亚洲av无码精品麻豆 | 国产99视频精品免视看7| 人与狗精品AA毛片| 久久久久九国产精品| 久久久久国产精品麻豆AR影院 | 狠狠精品久久久无码中文字幕| sss视频在线精品| 亚洲国产成人久久精品99| 亚洲国产主播精品极品网红 | 蜜桃麻豆WWW久久囤产精品| 亚洲精品午夜无码专区| 国产成人精品无码一区二区三区| 久久久WWW成人免费精品| 久久久久国产日韩精品网站| 久久久久久久久久免免费精品| 精品视频一区二区三区| 久久国产成人精品国产成人亚洲 | 一区国产传媒国产精品| 国内精品伊人久久久影院| 亚洲日韩国产AV无码无码精品| 人妻少妇看A偷人无码精品| 日本精品无码一区二区三区久久久|