求一句UPDATE语句

amu1433 2016-07-08 12:21:36

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
...全文
144 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ACMAIN_CHM 2016-07-08
  • 打赏
  • 举报
回复
引用
用一句sql能update更新? 这个应该属于递归...
MYSQL中无法用一句标准SQL语句实现,必须使用存储过程进行递归或者循环来实现。
zjcxc 2016-07-08
  • 打赏
  • 举报
回复

-- 示例数据
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;
示申○言舌 2016-07-08
  • 打赏
  • 举报
回复
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;
  • 打赏
  • 举报
回复
如果是查询直接的下属是3个人,应该不用递归查询,因为按照这个逻辑,id=3,也应该满足这个要求,不过从数据上来看2,3都是相互的上级,这个是不是数据有问题呢?
amu1433 2016-07-08
  • 打赏
  • 举报
回复
递归查询 下家满足三人 然后更新vip=1 能用一句sql或者 储存过程实现?

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧