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;