目录
查询当前分类及所有子级分类
MySQL
sql
WITH RECURSIVE temp AS (
-- 1.锚点查询(起始节点)
SELECT
c1.*
FROM
category c1
WHERE c1.id = 1477358020655718400 -- 要查询的起始节点ID,存在多个时用IN
UNION ALL
-- 2.递归查询(关联子节点)
SELECT
c2.*
FROM
category c2
INNER JOIN temp ON c2.parent_id = temp.id -- 子节点的parent_id = 上一级节点的id
)
-- 3.输出所有子节点(包括起始节点本身,如需排除可加条件)
SELECT * FROM temp
Oracle
sql
WITH temp(id) AS (
-- 1.锚点查询(起始节点)
SELECT
c1.id
FROM
category c1
WHERE
c1.id = 1477358020655718400 -- 要查询的起始节点ID,存在多个时用IN
UNION ALL
-- 2.递归查询(关联子节点)
SELECT
c2.id
FROM
category c2, temp
WHERE
c2.parent_id = temp.id -- 子节点的parent_id = 上一级节点的id
)
SELECT * FROM temp
查询当前分类及所有父级分类
Oracle
sql
SELECT
c.*
FROM
category c
START WITH
c.id = 1477358020655718400 -- 要查询的起始节点ID,存在多个时用IN
CONNECT BY PRIOR c.parent_id = c.id
查询所有叶子节点分类
Oracle
sql
SELECT
c4.*
FROM
(
SELECT
c1.*
FROM
category c1
START WITH
c1.id = 1477358020655718400 -- 要查询的起始节点ID,存在多个时用IN
CONNECT BY PRIOR c1.id = c1.parent_id
) c4
WHERE
c4.id IN (
SELECT
c3.id
FROM
(
SELECT
CONNECT_BY_ISLEAF,
c2.*
FROM
category c2
START WITH
c2.parent_id IS NULL
CONNECT BY c2.parent_id = PRIOR id
) c3
WHERE
c3.CONNECT_BY_ISLEAF = 1
)