mysql树转查询,根据id查询所有子孙级的数据

需求:  查出当前用户下面所有的子用户信息. ( 传递父类id )
分析:
        方法一:   使用Java程序进行遍历查询. ( 一条一条查询, 执行效率低 )
        方法二:   sql递归查询. ( 单句查询, 效率比遍历查询高! )

1.库表结构如下: ( 自关联的 - 无限级用户表 ) 

å¨è¿éæå¥å¾çæè¿°
2.sql语句实现需求:
2.1 查所有的叶子节点. ( 不含自己 ),下面红色的地方,需要替换自己的属性和表名以及id值
SELECT u2.id, u2.name
FROM( 
     SELECT 
        @ids AS p_ids, 
        (SELECT @ids := GROUP_CONCAT(id) FROM test_user WHERE FIND_IN_SET(parentId, @ids)) AS c_ids, 
        @l := @l+1 AS LEVEL 
     FROM test_user, (SELECT @ids := '101', @l := 0 ) b  #此处为需要传递的父类id. 
     WHERE @ids IS NOT NULL 
    ) u1 
JOIN test_user u2
ON FIND_IN_SET(u2.id, u1.p_ids)  AND u2.id != '101'  #需要包含自己, 则删掉 !=

2.2 查所有的父节点. ( 含自己 ),下面红色的地方,需要替换自己的属性和表名以及id值
SELECT u2.id, u2.name 
FROM( 
     SELECT 
        @id AS c_ids, 
        ( SELECT @id := parentId FROM test_user WHERE id = @id ) AS p_ids, 
        @l := @l+1 AS LEVEL 
     FROM test_user, (SELECT @id := '105', @l := 0 ) b 
     WHERE @id > 0 
    ) u1
JOIN test_user u2  ON u1.c_ids = u2.id  

2.3查所有的父节点. ( 不含自己 ),下面红色的地方,需要替换自己的属性和表名以及id值
SELECT u2.id, u2.name 
FROM( 
     SELECT 
        @id AS c_ids, 
        ( SELECT @id := parentId FROM test_user WHERE id = @id ) AS p_ids, 
        @l := @l+1 AS LEVEL 
     FROM test_user, (SELECT @id := '105', @l := 0 ) b 
     WHERE @id > 0 
    ) u1
JOIN test_user u2  ON u1.c_ids = u2.id  AND u2.id != '105' 

原文链接:https://blog.youkuaiyun.com/qq_42986107/article/details/101113098

如果您要在MySQL查询树形结构的某一个汇总值,可以使用递归查询(Recursive Query)来实现。递归查询是指在查询中嵌套使用自身的查询,从而实现对树形结构的遍历操作。 假设您的树形结构数据模型是这样的: ```sql CREATE TABLE category ( id INT PRIMARY KEY, name VARCHAR(100), parent_id INT ); INSERT INTO category VALUES (1, '电器', NULL), (2, '手机', 1), (3, '电视', 1), (4, '华为', 2), (5, '小米', 2), (6, '索尼', 3), (7, '三星', 3), (8, '笔记本', 1), (9, 'ThinkPad', 8), (10, '戴尔', 8); ``` 现在,假设您要查询所有属于“手机”类别的商品的库存总量,可以使用以下SQL语句: ```sql WITH RECURSIVE sub_categories AS ( SELECT id FROM category WHERE name = '手机' UNION ALL SELECT c.id FROM category c JOIN sub_categories sc ON c.parent_id = sc.id ) SELECT SUM(stock) AS total_stock FROM product WHERE category_id IN (SELECT id FROM sub_categories); ``` 上述SQL语句使用了WITH RECURSIVE句定义了一个递归查询查询出了所有属于“手机”类别的孙节点的ID。然后,在主查询中使用了SUM函数计算所有符合条件的商品的库存总量。 需要注意的是,上述查询中用到了两个表:`category`表和`product`表,其中`category`表存储了树形结构的数据,而`product`表存储了商品信息和库存信息。在查询时需要将两个表进行JOIN操作,并根据`category`表中的层关系来查询出符合条件的所有商品。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值