假设我们有一张名为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语句,可以轻松地在给定日期范围内检索树状结构中的所有节点,并以清晰易懂的格式展示结果。

MySQL树状查询:在给定日期范围内的节点检索

原文地址: https://www.cveoy.top/t/topic/mRkF 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录