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 = 1 UNION ALL SELECT i.id, i.pid, i.name FROM items i INNER JOIN 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。
MySQL 8.0以下可以使用自连接查询实现递归查询:
SELECT * FROM ( SELECT id, pid, name FROM items WHERE id = 1 UNION ALL SELECT i.id, i.pid, i.name FROM items i INNER JOIN ( SELECT * FROM ( SELECT id, pid, name FROM items WHERE id = 1 UNION ALL SELECT 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。
来源地址:https://blog.csdn.net/MoonJo_M/article/details/130218553
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341