table_user id user shangjiaid vip 1 用户A 2 0 2 用户B 3 0 3 用户C 2 0 4 用户D 5 0 5 用户E 5 0 6 用户F 5 0 7 用户G 2 0 8 用户H 5 0 9 用户J 2 0 10 用户K 5 0 11 用户K 5 0 12 用户K 7 0 13 用户K 12 0 更新VIP等于1 例如 id=5的这个人 下家的数量满足3个 然后更新vip=1 用一句sql能update更新? 这个应该属于递归... 就是说每个人都有上家...假如这个人下家满足3个人..然后更新VIP=1 update结果集 table_user id user shangjiaid vip 5 用户E 5 1 2 用户B 3 1
解决方案
10
假如是查询直接的下属是3个人,应该不用递归查询,原因是按照这个逻辑,id=3,也应该满足这个要求,不过从数据上来看2,3都是相互的上级,这个是不是数据有问题呢?
10
update table_user u left join ( select id, if( count( xiajiaid ) > 3, 1, 0 ) as vip from table_user group by id ) x on u.id=x.id set u.vip=x.vip;
30
-- 示例数据 drop table if exists table_user; create table table_user(id int, user varchar(10), shangjiaid int, vip bit); insert table_user values (1, "用户A", 2, 0), (2, "用户B", 3, 0), (3, "用户C", 4, 0), (4, "用户D", 5, 0), (5, "用户E", 5, 0), (6, "用户F", 5, 0), (7, "用户G", 2, 0), (8, "用户H", 5, 0), (9, "用户J", 2, 0), (10, "用户K", 5, 0), (11, "用户K", 5, 0), (12, "用户K", 7, 0), (13, "用户K", 12, 0); select * from table_user; -- 统计下家数的函数 drop function if exists f_ChildCount; delimiter $$ create function f_ChildCount( vId int ) returns int begin declare vCount int default 0; declare vIds varchar(4000) default cast(vId as char); REPEAT select group_concat(id), vCount+count(*) into vIds,vCount from table_user where find_in_set(shangjiaid,vIds)>0 and shangjiaid<>id; UNTIL( vIds is null) END REPEAT; return vCount; end$$ delimiter ; -- 查询下家数,更新就不用说了吧,判断一一下函数返回值即可 select *,f_ChildCount(id) from table_user;
18