0


MySQL一条语句递归查询所有子集数据

MySQL中,现有一组数据,数据包含字段主键:id,父类ID:pid,id与pid是继承关系,根据某个id查询其下级关联的所有记录;
1、利用递归查询语法。递归查询是在 MySQL 8.0 版本引入的新特性,如果您的 MySQL 版本低于 8.0,则无法使用递归查询语法。

WITH RECURSIVE sub_items AS(SELECT id, pid, name
    FROM items
    WHERE id =1UNIONALLSELECT i.id, i.pid, i.name
    FROM items i
    INNERJOIN sub_items si ON si.id = i.pid
)SELECT*FROM sub_items;

在上面的语句中,使用了 Common Table Expressions (CTE) 和递归查询来实现。首先,定义了一个 CTE sub_items,其中包含了 ID 为 1 的记录。然后,使用 UNION ALL 将这个记录和其下级记录合并起来,一直递归下去,直到找到所有下级记录。最后,在最外层使用 SELECT 语句查询并返回这些记录。
在实际使用时,需要将语句中的 items 替换成实际的表名,将 id、pid、name 替换成实际的字段名,将 1 替换成要查询的 ID。

2、MySQL 8.0以下可以使用自连接查询实现递归查询:

SELECT*FROM(SELECT id, pid, name FROM items  WHERE id =1UNIONALLSELECT i.id, i.pid, i.name
    FROM items  i
    INNERJOIN(SELECT*FROM(SELECT id, pid, name FROM items  WHERE id =1UNIONALLSELECT id, pid, name FROM items WHERE pid =1) t1
    ) t2 ON i.pid = t2.id
) t3

在上面的语句中,使用了两个子查询,第一个子查询获取 ID 为 1 的记录,第二个子查询获取 ID 为 1 的记录以及其下级记录。然后,使用 UNION ALL 将这两个子查询的结果合并起来,实现递归查询。
在实际使用时,需要将语句中的 items 替换成实际的表名,将 id、pid、name 替换成实际的字段名,将 1 替换成要查询的 ID。

标签: mysql 数据库 sql

本文转载自: https://blog.csdn.net/MoonJo_M/article/details/130218553
版权归原作者 MonGoo240 所有, 如有侵权,请联系我们删除。

“MySQL一条语句递归查询所有子集数据”的评论:

还没有评论