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