文字描述有些苦涩,也不好理解,直接上图。
比如数据库中 test表
存在如下数据:
id | path |
---|---|
1 | 0,10,52,215,641, |
2 | 0,32,167, |
3 | 0,24,128,414, |
4 | 0,23, |
注:测试数据中path最多5层,处理时,可以按照需求来修改sql语句
需要的结果如下(没有对应的则补零):
id | path | cate_id | cate2_id | cate3_id | cate4_id | cate5_id |
---|---|---|---|---|---|---|
1 | 0,10,52,215,641, | 0 | 10 | 52 | 215 | 641 |
2 | 0,32,167, | 0 | 32 | 167 | 0 | 0 |
3 | 0,24,128,414, | 0 | 24 | 128 | 414 | 0 |
4 | 0,23, | 0 | 23 | 0 | 0 | 0 |
解决办法很多,现在只通过sql 语句来实现。使用的函数是 substring_index
函数简介:
按关键字截取字符串
substring_index(str,delim,count)
说明:substring_index(被截取字段,关键字,关键字出现的次数)
例:select substring_index(“www.baidu.com”,".",2) as abstract from my_content
结果:www.baidu
(注:如果关键字出现的次数是负数 如-2 则是从后倒数,到字符串结束)
如果我要中间的的baidu怎么办?
很简单的,两个方向:
从右数第二个分隔符的右边全部,再从左数的第一个分隔符的左边:
substring_index(substring_index(www.baidu.com,’.’,-2),’.’,1);
回到刚才问题,处理path
字段,sql 如下:
SELECT
`id`,
`path`,
substring_index(
substring_index( path, ',',- ( LENGTH( path ) - LENGTH( REPLACE ( path, ',', '' ) ) + 1 ) ),
',',
1
) + 0 AS cate_id,
substring_index( substring_index( path, ',',- ( LENGTH( path ) - LENGTH( REPLACE ( path, ',', '' ) ) ) ), ',', 1 ) AS cate2_id,
substring_index(
substring_index( path, ',',- ( LENGTH( path ) - LENGTH( REPLACE ( path, ',', '' ) ) - 1 ) ),
',',
1
) + 0 AS cate3_id,
substring_index(
substring_index( path, ',',- ( LENGTH( path ) - LENGTH( REPLACE ( path, ',', '' ) ) - 2 ) ),
',',
1
) + 0 AS cate4_id,
substring_index(
substring_index( path, ',',- ( LENGTH( path ) - LENGTH( REPLACE ( path, ',', '' ) ) - 3 ) ),
',',
1
) + 0 AS cate5_id
FROM
test