十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
在 SQL 中,你可以使用递归查询来实现递归函数。递归查询是一种查询,其中结果集由一条或多条 SELECT 语句和一条用于查找下一级行的 UNION ALL 语句组成。
创新互联专注于内乡网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供内乡营销型网站建设,内乡网站制作、内乡网页设计、内乡网站官网定制、微信小程序服务,打造内乡网络公司原创品牌,更为您提供内乡网站排名全网营销落地服务。
例如,假设你有一张表,其中包含父子关系的信息(即,每个记录都有一个父级 ID,表示它的父级),你可以使用以下递归查询来查询每个记录的所有祖先:
WITH RECURSIVE ancestors AS (
-- 初始查询
SELECT id, parent_id
FROM your_table
WHERE id = :your_id
UNION ALL
-- 递归查询
SELECT t.id, t.parent_id
FROM your_table t
INNER JOIN ancestors a ON t.id = a.parent_id
)
SELECT id FROM ancestors;
在这个查询中,我们使用了一个递归关系,其中第一个 SELECT 语句是初始查询,用于查询给定 ID 的记录。第二个 SELECT 语句是递归查询,用于查询与当前记录的父级相关的记录。通过将这两个 SELECT 语句用 UNION ALL 连接起来,我们就可以获得所有祖先的列表了。
一般比较普遍的就是四种方法:(具体见 SQL Anti-patterns这本书)
因为不支持递归查询,所以Mysql官方当时推荐的是第三种方式:Nested Sets。我是用过的,非常难受。现在支持递归查询,我们可以使用第一种。
其实我还用了一种,一列维持顺序,一列维持层级,有空可以把实现写出来看看。
英文好的朋友请移步到这里: Managing Hierarchical Data in MySQL Using the Adjacency List Model ,不好的同学跟我一起来。
直接语句说明:
好,就这些吧。我是姜友华,下次见。
首先创建一个熟悉的机构表
插入几条测试数据:
union all上面的是初始化语句,只会执行一次,查到了 开发部 这一行记录。
接下来下面的join会用初始化的语句去原来的organization表去join获取所有 开发部的子部门 ,然后再用这些 子部门 去join更下面的部门。
执行的结果如下:
如下想查询开发部的所有上级部门的话上面的递归查询语句简单改一下就可以了:
执行结果如下:
Recursive Common Table Expression 'temp' can contain neither
aggregation nor window functions in recursive query block
mysql
mysql对递归的深度是有限制的,默认的递归深度是1000。
可以通过 show variables like 'cte_max_recursion_depth'; 进行查看
也可以通过select语句最大执行时间对递归加以显示, show variables lile 'max_execution_time';
单表自身关联查询,关联条件就是父节点pcode和code相等,查询字段包含pcode和sorce,将查询结果作为新表按pcode分组,用group by,查询字段是count记录数,这样就获取pcode的节点值,这是整体思路