mysql 向上递归

SELECT T1.lvl,T2.*  #lvl 跟查询无限下级的level一样
     FROM (
         SELECT
             @r AS _id,  #变量取个别名
             (SELECT @r := parent_id FROM sys_depart WHERE id = _id limit 1) AS parent_id, #limit 1不加会报错,因为子查询不允许有多个,我当时没加在navicat是没问题,但是项目里就报错!  parent_id 你的父级id的字段 sys_depart 你的表名
               @l := @l + 1 AS lvl  # T1.lvl 的来历,没用可以不要!或者感觉看不懂可以取消了
         FROM
             (SELECT @r := '156532be0aa54d3ea1',@l := 0) vars, # @r := '9a61ebfffcc5430480fdd21245b1bf0c' 就是你要查的id,@l := 0 定义T1.lvl的初始值为0 没用可以取消不要
             sys_depart h
         WHERE parent_id <> 0) T1  #parent_id 你的父级id的字段 查询条件就是不等于0,可以根据自己业务做修改
    JOIN sys_depart T2
     ON T1.parent_id = T2.id
     ORDER BY T1.lvl DESC;
原文地址:https://www.cnblogs.com/LarryBlogger/p/15430025.html