如何用 SQL 中的循环查询无限级分类的所有子类
表结构
infinite.region
id | parent_id | name |
---|---|---|
1 | 0 | 亚洲 |
2 | 0 | 北美洲 |
3 | 1 | 中国 |
4 | 1 | 日本 |
5 | 2 | 美国 |
6 | 1 | 韩国 |
7 | 3 | 北京 |
8 | 3 | 成都 |
定义一个 function
delimiter //
DROP FUNCTION IF EXISTS `getAllChdID`;
CREATE FUNCTION `getAllChdID`(parentID INT)
RETURNS varchar(255)
BEGIN
DECLARE allChdIdList VARCHAR ( 255 );
DECLARE curChdIdList VARCHAR ( 255 );
# 存储所有子类
SET allChdIdList = '$';
# 存储当前类的子类
SET curChdIdList = cast( parentID AS CHAR );
WHILE curChdIdList IS NOT NULL DO
# 将当前类的子类添加到所有子类尾部
SET allChdIdList = concat( allChdIdList, ',', curChdIdList );
# 查询当前子类的所有子类并覆盖掉当前子类
SELECT
group_concat( id ) INTO curChdIdList
FROM
infinite.region
WHERE
FIND_IN_SET( parent_id, curChdIdList ) > 0;
END WHILE;
RETURN allChdIdList;
END
//
delimiter ;
运行一下
说明
- concat:将两个字符串通过
,
连接 - group_concat:将
ID
字段的值进行连接 - FIND_IN_SET:返回
parent_id
在curChdIdList
字符串中的位置
应用一下下
infinite.users
id | region_id | name |
---|---|---|
1 | 3 | 小明 |
2 | 3 | 小红 |
3 | 3 | 小张 |
4 | 4 | 老王 |
5 | 4 | 老张 |
6 | 4 | 小黑 |
7 | 5 | 大黄 |
8 | 7 | 大虾 |
9 | 8 | 零七 |
10 | 8 | 天空 |
11 | 8 | 玛丽 |
本作品采用《CC 协议》,转载必须注明作者和本文链接
程序里不适合用存储过程吧
方法可能是可以实现,但是,不建议用mysql 去组装这些数据,这样导致接口性能很慢,建议查询出来用代码处理就好了