最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL中將逗號(hào)分隔的字段轉(zhuǎn)換為多行數(shù)據(jù)的方法

 更新時(shí)間:2024年04月03日 08:24:32   作者:修己xj  
在我們的實(shí)際開(kāi)發(fā)中,經(jīng)常需要存儲(chǔ)一些字段,它們使用像,?-?等連接符進(jìn)行連接,在查詢過(guò)程中,有時(shí)需要將這些字段使用連接符分割,然后查詢多條數(shù)據(jù),今天,我們將使用一個(gè)實(shí)際的生產(chǎn)場(chǎng)景來(lái)詳細(xì)解釋這個(gè)解決方案,需要的朋友可以參考下

場(chǎng)景介紹

最近我們對(duì)一個(gè)需求進(jìn)行了改造。在此之前,我們有一個(gè)工單信息表名為bus_mark_info,其中包含一個(gè)配置字段pages。以前,為了方便配置,配置人員直接將多個(gè)頁(yè)面使用逗號(hào)連接后保存,就像是將page1, page2, page3等直接存儲(chǔ)在了該字段中。隨著業(yè)務(wù)的發(fā)展,我們現(xiàn)在需要對(duì)每個(gè)頁(yè)面進(jìn)行單獨(dú)配置,并添加一些其他屬性。為了實(shí)現(xiàn)這一需求,我們?cè)赽us_mark_info表中添加了一個(gè)關(guān)聯(lián)表bus_pages。在上線時(shí),我們需要將已有的pages字段中配置歷史數(shù)據(jù)的頁(yè)面值使用逗號(hào)進(jìn)行分割,并存入新的表中,然后廢棄掉工單信息表中的pages字段。bus_mark_info表數(shù)據(jù)如下:

查詢SQL 語(yǔ)句編寫

我們首先是將要新增的數(shù)據(jù)查詢出來(lái),然后使用insert into ... select 遷移到我們的新表中。話不多說(shuō),我們直接上sql:

SELECT 
 T1.id,
 SUBSTRING_INDEX( SUBSTRING_INDEX( T1.pages, ',', T2.help_topic_id + 1 ), ',',- 1 ) AS page 
FROM
 bus_mark_info T1
 JOIN mysql.help_topic T2 ON T2.help_topic_id < ( length( T1.pages )- length( REPLACE ( T1.pages, ',', '' ))+ 1 ) 
WHERE
 T1.pages IS NOT NULL 
ORDER BY
 T1.id,
 T2.help_topic_id

在這個(gè)sql中,我們使用了mysql 的help_topic表,這個(gè)表存儲(chǔ)的是各種注釋、地址等幫助信息,內(nèi)容如下:

這個(gè)表有一個(gè)特性,就是它有從0開(kāi)始自增為1的id屬性--help_topic_id 并且 擁有固定數(shù)量(701)的數(shù)據(jù)。

  • 關(guān)聯(lián)數(shù)據(jù)數(shù)量

原始的bus_mark_info表中的每條數(shù)據(jù),在與help_topic表關(guān)聯(lián)后會(huì)生成多條新數(shù)據(jù)。具體來(lái)說(shuō),對(duì)于bus_mark_info表中的每條記錄,我們期望生成的關(guān)聯(lián)數(shù)據(jù)數(shù)量應(yīng)該等于該記錄中pages字段中逗號(hào)的數(shù)量加1。例如,如果某條數(shù)據(jù)的pages字段的取值為page1,page2,page3,那么我們應(yīng)該生成三條關(guān)聯(lián)數(shù)據(jù)。因此,我們的關(guān)聯(lián)條件應(yīng)該是T2.help_topic_id < (length(T1.pages) - length(REPLACE(T1.pages, ',', '')) + 1)。

  • 正確分割字段

一旦確保了正確的關(guān)聯(lián)數(shù)據(jù)數(shù)量,我們需要根據(jù)help_topic_id的值來(lái)截取我們的數(shù)據(jù)。例如,當(dāng)help_topic_id為0時(shí),我們應(yīng)該取pages字段中第一個(gè)逗號(hào)之前的值;當(dāng)help_topic_id為1時(shí),我們應(yīng)該取pages字段中第一個(gè)逗號(hào)和第二個(gè)逗號(hào)之間的值,依此類推。為實(shí)現(xiàn)這一目標(biāo),我們將使用兩個(gè)SUBSTRING_INDEX函數(shù)來(lái)進(jìn)行數(shù)據(jù)截取。首先,我們將截取從開(kāi)始位置到help_topic_id+1個(gè)逗號(hào)之前的部分,然后再截取該部分中最后一個(gè)逗號(hào)之后的部分,即SUBSTRING_INDEX( SUBSTRING_INDEX( T1.pages, ',', T2.help_topic_id + 1 ), ',',- 1 )。通過(guò)這樣的處理,我們便成功地利用help_topic_id和SUBSTRING_INDEX函數(shù)完成了數(shù)據(jù)的分割。

  • 注意事項(xiàng)

當(dāng)然,我們使用help_topic是因?yàn)樗膆elp_topic_id是從0開(kāi)始,每次遞增1的,我們也可以使用有次特性的別的表或者數(shù)據(jù)代替。 help_topic_id最大值為700,也就是說(shuō)我們這個(gè)sql只能處理pages最多有701個(gè)頁(yè)面連接的數(shù)據(jù),如果有些pages字段分割之后的數(shù)量大于701,我們則需要使用別的表來(lái)替代。

如果有家人對(duì)SUBSTRING_INDEX函數(shù)和insert into ... select不太熟悉的話可以翻閱下我們歷史的文章,有專門介紹過(guò)。

遷移數(shù)據(jù)sql

遷移數(shù)據(jù)的sql如下:

INSERT INTO bus_pages ( mark_id, page ) SELECT
T1.id,
SUBSTRING_INDEX( SUBSTRING_INDEX( T1.pages, ',', T2.help_topic_id + 1 ), ',',- 1 ) AS page 
FROM
 bus_mark_info T1
 JOIN mysql.help_topic T2 ON T2.help_topic_id < ( length( T1.pages )- length( REPLACE ( T1.pages, ',', '' ))+ 1 ) 
WHERE
 T1.pages IS NOT NULL 
ORDER BY
 T1.id,
 T2.help_topic_id

執(zhí)行后數(shù)據(jù)表如下:

總結(jié)

在實(shí)際開(kāi)發(fā)中,當(dāng)需要對(duì)包含多個(gè)字段連接符的數(shù)據(jù)進(jìn)行查詢與遷移時(shí),可以使用SQL中的SUBSTRING_INDEX函數(shù)結(jié)合一些輔助表的特性進(jìn)行數(shù)據(jù)分割和遷移。通過(guò)合理的SQL編寫,可以有效處理數(shù)據(jù)關(guān)聯(lián)與拆分,達(dá)到遷移數(shù)據(jù)的目的。

以上就是MySQL中使用逗號(hào)分隔的字段轉(zhuǎn)換為多行數(shù)據(jù)的詳細(xì)內(nèi)容,更多關(guān)于MySQL字段轉(zhuǎn)多行數(shù)據(jù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Mysql中時(shí)間戳轉(zhuǎn)為Date的方法示例

    Mysql中時(shí)間戳轉(zhuǎn)為Date的方法示例

    這篇文章主要給大家介紹了關(guān)于Mysql中時(shí)間戳轉(zhuǎn)為Date的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Mysql使用on update current_timestamp問(wèn)題

    Mysql使用on update current_timestamp問(wèn)題

    這篇文章主要介紹了Mysql使用on update current_timestamp問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • centos下安裝mysql服務(wù)器的方法

    centos下安裝mysql服務(wù)器的方法

    本篇文章是對(duì)在centos下安裝mysql服務(wù)器的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • MySQL中SHOW TABLE STATUS的使用及說(shuō)明

    MySQL中SHOW TABLE STATUS的使用及說(shuō)明

    這篇文章主要介紹了MySQL中SHOW TABLE STATUS的使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • MYSQL無(wú)法連接 提示10055錯(cuò)誤的解決方法

    MYSQL無(wú)法連接 提示10055錯(cuò)誤的解決方法

    這篇文章主要介紹了MYSQL無(wú)法連接 提示10055錯(cuò)誤的解決方法,需要的朋友可以參考下
    2016-12-12
  • MySQL8.0/8.x忘記密碼更改root密碼的實(shí)戰(zhàn)步驟(親測(cè)有效!)

    MySQL8.0/8.x忘記密碼更改root密碼的實(shí)戰(zhàn)步驟(親測(cè)有效!)

    忘記root密碼的場(chǎng)景還是比較常見(jiàn)的,特別是自己搭的測(cè)試環(huán)境經(jīng)過(guò)好久沒(méi)用過(guò)時(shí),很容易記不得當(dāng)時(shí)設(shè)置的密碼,下面這篇文章主要給大家介紹了關(guān)于MySQL8.0/8.x忘記密碼更改root密碼的實(shí)戰(zhàn)步驟,親測(cè)有效!需要的朋友可以參考下
    2023-04-04
  • MySQL的事務(wù)和視圖使用及說(shuō)明

    MySQL的事務(wù)和視圖使用及說(shuō)明

    事務(wù)是數(shù)據(jù)庫(kù)中一組SQL語(yǔ)句,要么全部執(zhí)行成功,要么全部不執(zhí)行,事務(wù)的四個(gè)特征為原子性、一致性、持久性和隔離性,隔離性主要解決并發(fā)情況下可能出現(xiàn)的臟讀、不可重復(fù)讀和幻讀問(wèn)題,視圖是一個(gè)虛擬表,根據(jù)其他表或視圖的查詢結(jié)果生成,視圖可以創(chuàng)建、修改和刪除
    2026-01-01
  • MySQL入門(三) 數(shù)據(jù)庫(kù)表的查詢操作【重要】

    MySQL入門(三) 數(shù)據(jù)庫(kù)表的查詢操作【重要】

    本節(jié)比較重要,對(duì)數(shù)據(jù)表數(shù)據(jù)進(jìn)行查詢操作,其中可能大家不熟悉的就對(duì)于INNER JOIN(內(nèi)連接)、LEFT JOIN(左連接)、RIGHT JOIN(右連接)等一些復(fù)雜查詢。 通過(guò)本節(jié)的學(xué)習(xí),可以讓你知道這些基本的復(fù)雜查詢是怎么實(shí)現(xiàn)的,,需要的朋友可以參考下
    2018-07-07
  • MySQL數(shù)據(jù)庫(kù)中表的查詢實(shí)例(單表和多表)

    MySQL數(shù)據(jù)庫(kù)中表的查詢實(shí)例(單表和多表)

    查詢數(shù)據(jù)是數(shù)據(jù)庫(kù)操作中最常用,也是最重要的操作,下面這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)中表的查詢的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-03-03
  • 利用Xtrabackup工具備份及恢復(fù)(MySQL DBA的必備工具)

    利用Xtrabackup工具備份及恢復(fù)(MySQL DBA的必備工具)

    Xtrabackup 是percona的一個(gè)開(kāi)源項(xiàng)目,可以熱備份innodb ,XtraDB,和MyISAM(會(huì)鎖表),可以看做是InnoDB Hotbackup的免費(fèi)替代品
    2013-04-04

最新評(píng)論

香港| 商水县| 临武县| 天全县| 兴国县| 乐都县| 沙河市| 肥西县| 醴陵市| 宁远县| 宜都市| 喀什市| 北安市| 娱乐| 鄂伦春自治旗| 达州市| 廉江市| 彩票| 永德县| 尼勒克县| 尤溪县| 恩平市| 都昌县| 海淀区| 察雅县| 磴口县| 水城县| 安庆市| 专栏| 喜德县| 玛沁县| 丰顺县| 仙桃市| 榆林市| 会东县| 突泉县| 周口市| 贵阳市| 平定县| 德庆县| 山阳县|