1.先说下本文的背景以及结合什么样的需求作出具体的功能: 最近本人公司半道子不知道老板从哪旮沓里(老板应该不看这类技术型博客,O(∩_∩)O)接手了一个半吊子项目来(接盘侠),先不谈这个项目是咋滴咋滴的。这个项目的注册逻辑是有推荐关系的,分推荐注册和无推荐注册两种,这样的话就会形成一条推荐关系链,但是前期开发项目的人没有在数据库维护好这个推荐关系链,导致到了我们这里这些是没有数据的,因此需要根据每个有推荐人的用户来把他们的推荐关系链修复好,也就是根据用户自己的推荐人获取到推荐人的id,然后再通过推荐人id的推荐人去查找上一级的推荐人,以此类推,最后以推荐人id-推荐人id的形式形成一条推荐关系链,最前面的就是最早注册的哪个人,最末端就是用户自己的推荐人。 2.本人由于也不是经常写存储过程,因此也是网上查找了很多资料,本次需求的逻辑也就是通过游标进行循环遍历,然后判断,赋值等一系列操作,先查找出全部的用户id,然后通过定义游标赋值给游标,然后进行循环(这个循环和iterator很类似),好了 废话结束,上sql,希望这个能帮到看本篇博文的你。 CREATE DEFINER=`admin`@`%` PROCEDURE `updateRecommended`() BEGIN DECLARE my_recommended INT; DECLARE my_id INT; DECLARE inviteRelationStr VARCHAR(10000); -- 创建自定义控制游标循环变量 DECLARE done TINYINT DEFAULT FALSE; -- 创建自定义游标 并输入结果集 DECLARE my_cursor CURSOR FOR (SELECT id FROM hft_user); DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; SET inviteRelationStr = ''; -- 打开游标 OPEN my_cursor; -- 循环开始 my_loop: LOOP FETCH NEXT FROM my_cursor INTO my_id; IF done THEN LEAVE my_loop; END IF; -- 开始操作 SELECT recommended INTO my_recommended FROM hft_user WHERE id = my_id; WHILE my_recommended IS NOT NULL OR my_recommended != '' DO SET inviteRelationStr = CONCAT(my_recommended,'-',inviteRelationStr); SELECT recommended INTO my_recommended FROM hft_user WHERE id = my_recommended; END WHILE; -- 修改推荐连 UPDATE hft_user SET invite_relation = inviteRelationStr WHERE id = my_id; SET inviteRelationStr = ''; -- 提交事务 COMMIT; END LOOP my_loop; CLOSE my_cursor; -- 关闭游标 END (责任编辑:IT) |