之前项目里要用到无限上下级的sql,在度娘里翻了十几页都是复制粘贴还不管对错的,真的是没人品!好气,只好静下心自己慢慢研究他们错误的地方,慢慢改过来了!希望幸运儿最先看到的是我的这个,不用像我当初那样悲催
1 //查询无限下级sql 2 SELECT ID.level, DATA.* FROM( //ID.level 这个是查询到第几个级别了 2:就是当前用户的直属下级,3:就是下级的直推下级!DATA.* 就是所有的用户信息
3 SELECT 4 @ids AS _ids,//@会话级变量,不需要声明,直接写直接用. 这句话就是给这个变量起个别名,别多想! 5 ( SELECT @ids := GROUP_CONCAT(id) // group_count 1、功能:将group by产生的同一个分组中的值连接起来,返回一个字符串结果。2、语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )
6 FROM member_user 7 WHERE FIND_IN_SET(intro_user, @ids) //FIND_IN_SET 跟in类似,@ids这个变量里面 包含intro_user 这个id的! intro_user 你自己定义的父级id的名字 8 ) AS cids, 9 @l := @l+1 AS LEVEL //LEVEL 这个level 就是第一行的ID.leve 没用可以不要 10 FROM member_user, 11 (SELECT @ids :='f946aaaf1e9b43a597451f6a8e4ac389', @l := 0 ) b //@ids :='f946aaaf1e9b43a597451f6a8e4ac389' 这个是你要查下级的id 12 WHERE @ids IS NOT NULL 13 ) id, member_user DATA //member_user 就是你的表,所有的都要换了 14 WHERE FIND_IN_SET(DATA.id, ID._ids) 15 ORDER BY ID.level, id 16 17 //查询无限父级sql 18 SELECT T1.lvl,T2.* //lvl 跟查询无限下级的level一样 19 FROM ( 20 SELECT 21 @r AS _id, //变量取个别名 22 (SELECT @r := intro_user FROM member_user WHERE id = _id limit 1) AS intro_user, //limit 1不加会报错,因为子查询不允许有多个,我当时没加在navicat是没问题,但是项目里就报错! intro_user 你的父级id的字段 member_user 你的表名 23 @l := @l + 1 AS lvl // T1.lvl 的来历,没用可以不要!或者感觉看不懂可以取消了 24 FROM 25 (SELECT @r := '9a61ebfffcc5430480fdd21245b1bf0c',@l := 0) vars, // @r := '9a61ebfffcc5430480fdd21245b1bf0c' 就是你要查的id,@l := 0 定义T1.lvl的初始值为0 没用可以取消不要 26 member_user h 27 WHERE intro_user <> 0) T1 //intro_user 你的父级id的字段 查询条件就是不等于0,可以根据自己业务做修改 28 JOIN member_user T2 29 ON T1.intro_user = T2.id 30 ORDER BY T1.lvl DESC
这个sql其实静下心来,慢慢拆解来看,其实就是几个子查询,确定了顺序,自己多看几遍就会了!goodluck!