MySQL树状查询:在给定日期范围内的节点检索
假设我们有一张名为tree的表,其中包含了每个节点的id,父节点id,节点名称name和创建时间created_at,可以使用以下SQL查询在给定日期范围内的树状结构:
WITH RECURSIVE cte AS (
SELECT id, parent_id, name, created_at
FROM tree
WHERE created_at BETWEEN '2021-01-01' AND '2021-12-31'
AND parent_id IS NULL
UNION ALL
SELECT t.id, t.parent_id, t.name, t.created_at
FROM tree t
JOIN cte ON t.parent_id = cte.id
WHERE t.created_at BETWEEN '2021-01-01' AND '2021-12-31'
)
SELECT id, parent_id, name, created_at,
REPEAT('--', LEVEL - 1) || name AS tree_structure
FROM cte
ORDER BY tree_structure;
这个SQL语句使用了CTE(Common Table Expression)和递归查询来构建树状结构。首先,我们从根节点开始查询(parent_id IS NULL),然后不断地递归查询其子节点,直到找到所有符合条件的节点。最后,我们将节点按照树状结构排序,并在最后一列中使用REPEAT函数来生成节点的层级结构。
代码解读:
WITH RECURSIVE cte AS (...): 定义一个名为cte的递归公用表表达式(CTE)。SELECT ... FROM tree WHERE ... AND parent_id IS NULL: 查询tree表中创建时间在指定范围内的根节点(parent_id为空)。UNION ALL: 合并根节点查询结果和子节点查询结果。SELECT ... FROM tree t JOIN cte ON t.parent_id = cte.id WHERE ...: 递归查询子节点,JOIN操作将当前节点与父节点关联,并过滤符合条件的子节点。REPEAT('--', LEVEL - 1) || name AS tree_structure: 使用REPEAT函数生成节点的层级结构,LEVEL表示节点的层级,--为分隔符。ORDER BY tree_structure: 按照层级结构排序结果。
通过这个SQL语句,可以轻松地在给定日期范围内检索树状结构中的所有节点,并以清晰易懂的格式展示结果。
原文地址: https://www.cveoy.top/t/topic/mRkF 著作权归作者所有。请勿转载和采集!