SELECT GROUP_CONCAT(REPLACE(path,'/',',')) AS path FROM department b WHERE department_type = 1
執行結果:mysql
sql: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)
執行結果:blog
這個join最基本原理是笛卡爾積。經過這個方式來實現循環。string
分析:table
length(a.path) - length(replace(a.path,',',''))+1 表示了,按照逗號分割後,分割須要循環的次數。class
join過程:原理
根據ID進行循環循環
{方法
判斷:i 是否 <= nim
獲取最靠近第 i 個逗號以前的數據, 即 substring_index(substring_index(a.path,',',b.help_topic_id),',',-1)
}
這種方法的缺點在於,咱們須要一個擁有連續數列的獨立表。而且連續數列的最大值必定要大於符合分割的值的個數。
例若有一行的path有100個逗號分割的值,那麼咱們的table 就須要有至少100個連續行。
固然,mysql內部也有現成的連續數列表可用。如mysql.help_topic: help_topic_id 共有504個數值,通常能知足於大部分需求了。