在项目中遇到了递归查询,做一下记录:
首先在数据库中新创建一张有父子关系的表,表名为:test_recursive,id 和 parent_id 列只为了测试,使用了 int 类型,可以替换为 varcher() 类型:
查询 id=1 的节点及其所有子节点的递归查询语句为:
SELECT
a.id, a.name
FROM
(
SELECT
rd.*
FROM
(
SELECT
*
FROM
test_recursive
WHERE
parent_id IS NOT NULL
) rd,
(
SELECT
@pid := 1 #varcher()类型记得加单引号
) pd
WHERE
FIND_IN_SET(parent_id, @pid) > 0
AND @pid := concat(@pid, ',', id)
UNION
SELECT
*
FROM
test_recursive
WHERE
id = 1 #varcher()类型记得加单引号
) a
查询结果:
去掉 union 语句后面的 select 语句,则查询的结果不包含 id=1 的节点:
查询语句为:
SELECT
a.id, a.name
FROM
(
SELECT
rd.*
FROM
(
SELECT
*
FROM
test_recursive
WHERE
parent_id IS NOT NULL
) rd,
(
SELECT
@pid := 1 #varcher()类型记得加单引号
) pd
WHERE
FIND_IN_SET(parent_id, @pid) > 0
AND @pid := concat(@pid, ',', id)
) a
查询结果:
以此记录,谨防忘记!!