加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

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

发布时间:2022-03-18 03:11:44 所属栏目:编程 来源:互联网
导读:这篇文章将为大家详细讲解有关让MySQL中单句实现无限层次父子关系查询的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 在 SQL Server 中,使用 CTE 表达式很容易做到无限层次父子关系查询;在不支持CTE表达式的
       这篇文章将为大家详细讲解有关让MySQL中单句实现无限层次父子关系查询的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
 
      在 SQL Server 中,使用 CTE 表达式很容易做到无限层次父子关系查询;在不支持CTE表达式的版本中,借助函数递归也可以轻松实现。
      在 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中单句实现无限层次父子关系查询的方法就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读