千家信息网

让MySQL中单句实现无限层次父子关系查询的方法

发表于:2024-11-15 作者:千家信息网编辑
千家信息网最后更新 2024年11月15日,这篇文章将为大家详细讲解有关让MySQL中单句实现无限层次父子关系查询的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在 SQL Server 中,使用 CTE
千家信息网最后更新 2024年11月15日让MySQL中单句实现无限层次父子关系查询的方法

这篇文章将为大家详细讲解有关让MySQL中单句实现无限层次父子关系查询的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

在 SQL Server 中,使用 CTE 表达式很容易做到无限层次父子关系查询;在不支持CTE表达式的版本中,借助函数递归也可以轻松实现。
在 MySQL 中,这个需求的实例稍显复杂, MySQL 中没有支持递归的查询,没有表值函数,函数不支持递归,所以通常都是用循环实现,显得比较别扭。今天看到一个用单条语句实现的递归查询,想法独特,分享一下。

相关mysql视频教程

表结构和数据

CREATE TABLE table1(id int, name varchar(10), parent_id int); INSERT table1 VALUES (1, 'Home',        0), (2, 'About',       1), (3, 'Contact',     1), (4, 'Legal',         2), (5, 'Privacy',      4), (6, 'Products',   1), (7, 'Support',     2);

查询 id = 5 的所有父级

SELECT ID.level, DATA.* FROM(     SELECT         @id as _id,         (   SELECT @id := parent_id             FROM table1             WHERE id = @id         ) as _pid,         @l := @l+1 as level     FROM table1,         (SELECT @id := 5, @l := 0 ) b     WHERE @id > 0 ) ID, table1 DATA WHERE ID._id = DATA.id ORDER BY level;

根据这个父级查询方法,很容易可以写出查所有子级的,下面的查询 id=2 的所有子级

SELECT ID.level, DATA.* FROM(     SELECT         @ids as _ids,         (   SELECT @ids := GROUP_CONCAT(id)             FROM table1             WHERE FIND_IN_SET(parent_id, @ids)         ) as cids,         @l := @l+1 as level     FROM table1,         (SELECT @ids :='1', @l := 0 ) b     WHERE @ids IS NOT NULL ) id, table1 DATA WHERE FIND_IN_SET(DATA.id, ID._ids) ORDER BY level, id

关于让MySQL中单句实现无限层次父子关系查询的方法就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

0