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


SELECT GROUP_CONCAT(REPLACE(path,'/',',')) AS path FROM department b WHERE department_type = 1

執行結果:

 

 

 sql:

SELECT DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(a.path,',',b.help_topic_id + 1),',',-1)   
FROM   
(SELECT GROUP_CONCAT(REPLACE(path,'/',',')) AS path FROM department b WHERE department_type = 1) a
JOIN  
mysql.help_topic b  
ON b.help_topic_id < (LENGTH(a.path) - LENGTH(REPLACE(a.path,',','')) + 1) 

執行結果:

 

原理分析:

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

分析:

length(a.path) - length(replace(a.path,',',''))+1  表示了,按照逗號分割后,分割需要循環的次數。

join過程:

根據ID進行循環

{

  判斷:i 是否 <= n

  獲取最靠近第 i 個逗號之前的數據, 即 substring_index(substring_index(a.path,',',b.help_topic_id),',',-1)

}

這種方法的缺點在於,我們需要一個擁有連續數列的獨立表。並且連續數列的最大值一定要大於符合分割的值的個數。

例如有一行的path有100個逗號分割的值,那么我們的table 就需要有至少100個連續行。

當然,mysql內部也有現成的連續數列表可用。如mysql.help_topic: help_topic_id 共有504個數值,一般能滿足於大部分需求了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM