有一个类别层次结构看起来是这样的:
--Level 1 category 1
|--Level 2 category 1
|--Level 3 category 1
|--Level 3 category 2
|--Level 3 category 3
|--Level 2 category 2
|--Level 3 category 4
|--Level 3 category 5
|--Level 3 category 6
--Level 1 category 2
|--Level 2 category 3
|--Level 3 category 7
如何检索任何级别的任何特定类别的父母、兄弟姐妹和子女?
例如;级别3类别5";,父母是";级别2类别2";,兄弟姐妹是";级别3类别4";以及";级别3类别6";,没有孩子。对于";级别2类别3";,父母是";级别1类别2";,兄弟姐妹是";级别2类别2";以及";级别2类别1";,一个孩子在";级别3类别7";;
我正在考虑使用WITH RECURSIVE查询,但无法确定如何执行。
您只需要使用递归CTE,因为您想获得树节点的兄弟节点,否则就没有必要了。递归CTE用于生成CCD_ 1值。
以下是查询可能看起来像
WITH RECURSIVE cte AS (
SELECT
*,
0 AS level
FROM categories
WHERE parent_id IS NULL
UNION ALL
SELECT
c.*,
cte.level + 1
FROM categories c
JOIN cte ON c.parent_id = cte.id
)
SELECT
c.id,
c.name,
c.parent_id,
cc.name AS parent_name,
GROUP_CONCAT(DISTINCT s.id) AS sinbling_ids,
GROUP_CONCAT(DISTINCT s.name) AS sibling_names,
GROUP_CONCAT(DISTINCT ch.id) AS children_ids,
GROUP_CONCAT(DISTINCT ch.name) AS childrent_names
FROM cte c
LEFT JOIN categories cc ON c.parent_id = cc.id
LEFT JOIN cte s ON c.level = s.level AND s.id != c.id
LEFT JOIN categories ch ON ch.parent_id = c.id
GROUP BY c.id, c.name, c.parent_id, cc.name
你可以查看dbfiddle