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个数值,通常能知足于大部分需求了。