Code Bye

求一句UPDATE语句

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

引用

用一句sql能update更新?  这个应该属于递归…

MYSQL中无法用一句标准SQL语句实现,必须使用存储过程进行递归或循环来实现。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明求一句UPDATE语句