sql模板如下:
SELECT
id,
pid
FROM
(
SELECT
t1.id,
t1.pid,
IF (
find_in_set(pid, @pids) > 0,
@pids := concat(@pids, ',', id),
'N'
) AS ischild --判断子节点是否在指定节点下面,如果在就拼接id逗号分割,不在就赋值为N
FROM
(
SELECT
id,
pid
FROM
表名称 t
WHERE
t.deleted = '0' --筛选条件
ORDER BY
pid,
id --排序
) t1,
(SELECT @pids := 指定节点的值) t2
) t3
WHERE
ischild != 'N' --将不是在指定节点下面的数据排除掉
上面的级联查询,在下级id小于上级id的时候,会有bug,导致查询的数量不对
还有一种写法:
第二式:
SELECT
ID.LEVEL,
b.id
FROM
(
SELECT
@ids AS _ids,
(
SELECT
@ids := GROUP_CONCAT(id)
FROM
数据库表名
WHERE
FIND_IN_SET(pid, @ids)
) AS cids,
@l := @l + 1 AS LEVEL
FROM
数据库表名,
(
SELECT
@ids := 指定节点的值, @l := 0) b WHERE @ids IS NOT NULL) id, 数据库表名 b
WHERE
FIND_IN_SET(b.id, ID._ids) and b.deleted='0' --后面跟一些筛选条件
ORDER BY
LEVEL,
id
这种查询结果,如果层级过多,导致拼接的字符串超过mysql的限制,也会出现查询结果不准确,
解决办法:
修改配置文件:my.ini
在[mysqld]下新增配置:group_concat_max_len = 102400
重启,通过
进入mysql状态,输入:show variables like ‘group_concat_max_len’;
查看即可。
特别的,有时我们并不知需要多大的字节才能满足需求,此种情况可以考虑不设置最大字节(即采用最大字节数)即在配置文件设置group_concat_max_len=-1
此种情况可以通过
进入mysql状态,输入:show variables like ‘group_concat_max_len’;