文档章节

3级分销(mysql存储过程写法)

h
 hahass
发布于 2016/11/17 13:24
字数 1463
阅读 6
收藏 0

BEGIN
 DECLARE sTemp TEXT ;
  /*父id*/
  DECLARE recomsTempChd TEXT ;
  /*子id*/
  DECLARE v_memberno INT DEFAULT 0 ;
  DECLARE v_arraymemberno INT DEFAULT 0 ;
  DECLARE v_recommemberno INT DEFAULT 0 ;
  DECLARE v_typeprice INT DEFAULT 0 ;
  DECLARE v_avg_cash INT DEFAULT 0 ;
  DECLARE v_avg_integral INT DEFAULT 0 ;
  DECLARE v_count INT DEFAULT 0 ;
  DECLARE v_count1 INT DEFAULT 0 ;
  DECLARE v_count2 INT DEFAULT 0 ;
  DECLARE v_count3 INT DEFAULT 0 ;
  DECLARE v_type INT DEFAULT 0 ;
  DECLARE v_jixiaoall DECIMAL DEFAULT 0 ;
  DECLARE v_child1000count INT DEFAULT 0 ;
  DECLARE v_node10000 TEXT DEFAULT '' ;
  DECLARE v_node10000count INT DEFAULT 0 ;
  DECLARE v_node20w TEXT DEFAULT '' ;
  DECLARE v_node100w TEXT DEFAULT '' ;
  DECLARE v_node300w TEXT DEFAULT '' ;
  DECLARE v_node900w TEXT DEFAULT '' ;
  DECLARE add20wprice DECIMAL DEFAULT 0 ;
  DECLARE add100wprice DECIMAL DEFAULT 0 ;
  DECLARE add300wprice DECIMAL DEFAULT 0 ;
  DECLARE add900wprice DECIMAL DEFAULT 0 ;
  DECLARE add20wchildcount INT DEFAULT 0 ;
  DECLARE add100wchildcount INT DEFAULT 0 ;
  DECLARE add300wchildcount INT DEFAULT 0 ;
  DECLARE add900wchildcount INT DEFAULT 0 ;
  DECLARE done INT DEFAULT - 1 ;
  DECLARE mycur CURSOR FOR 
  SELECT 
    memberno 
  FROM
    fathermembernos ;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1 ;
  SET sTemp = `getfatherNode` (membernos) ;
  SET recomsTempChd = `getRcommFather` (membernos) ;
  SELECT 
    typeprice,
    recommmemberno,
    `type` INTO v_typeprice,
    v_recommemberno,
    v_type 
  FROM
    member m 
  WHERE m.memberno IN (membernos) ;
  #设置总业绩和新增业绩\会员数量
  CASE
    v_type 
    WHEN 1 
    THEN 
    UPDATE 
      member_achievement 
    SET
      allachievement = allachievement + v_typeprice,
      okachievement = okachievement + v_typeprice,
            newachievement=newachievement+v_typeprice,
      microtype = microtype + 1 
    WHERE FIND_IN_SET(memberno, sTemp) > 0 
      AND memberno != membernos ;
    WHEN 2 
    THEN 
    UPDATE 
      member_achievement 
    SET
      allachievement = allachievement + v_typeprice,
      okachievement = okachievement + v_typeprice,
            newachievement=newachievement+v_typeprice,
      quicktype = quicktype + 1 
    WHERE FIND_IN_SET(memberno, sTemp) > 0 
      AND memberno != membernos ;
    WHEN 3 
    THEN 
    UPDATE 
      member_achievement 
    SET
      allachievement = allachievement + v_typeprice,
      okachievement = okachievement + v_typeprice,
            newachievement=newachievement+v_typeprice,
      startype = startype + 1 
    WHERE FIND_IN_SET(memberno, sTemp) > 0 
      AND memberno != membernos ;
  END CASE ;
  #直接推荐奖20%
  UPDATE 
    member_achievement 
  SET
    notrecommend = notrecommend + (v_typeprice * 0.2),
    getcash = getcash + (v_typeprice * 0.2),
        newrecommend=newrecommend+(v_typeprice * 0.2)
  WHERE memberno = v_recommemberno ;
  #垂直推荐奖4%
  UPDATE 
    member_achievement 
  SET
    newverticalaward = newverticalaward + (v_typeprice * 0.04),
    getcash = getcash + (v_typeprice * 0.04),
        verticalaward=verticalaward++ (v_typeprice * 0.04)
  WHERE memberno IN 
    (SELECT 
      recommmemberno 
    FROM
      member 
    WHERE memberno = v_recommemberno) ;
  #跨区推荐奖%6
  UPDATE 
    member_achievement 
  SET
    newcrossaward = newcrossaward + (v_typeprice * 0.06),
    getcash = getcash + (v_typeprice * 0.06),
        crossaward=crossaward++ (v_typeprice * 0.06)
  WHERE memberno IN  
    (SELECT 
      recommmemberno 
    FROM
      member 
    WHERE memberno IN 
      (SELECT 
        recommmemberno 
      FROM
        member 
      WHERE memberno = v_recommemberno)) ;
  SELECT 
    COUNT(1) INTO v_count1 
  FROM
    member m,member_achievement a
  WHERE m.bonus = 0 AND m.memberno=a.memberno 
    AND m.`type` = 1  
    AND a.marketshare < 5000 
    AND m.memberno IN  
    (SELECT 
      memberno 
    FROM
      member 
    WHERE recommmemberno = membernos) ;
  SELECT 
    COUNT(1) INTO v_count2 
  FROM
    member m,member_achievement a 
  WHERE m.bonus = 0 AND m.memberno=a.memberno 
    AND m.`type` = 2 
    AND a.marketshare < 25000 ;
  SELECT 
    COUNT(1) INTO v_count3 
  FROM
    member m,member_achievement a  
  WHERE m.bonus = 0 AND m.memberno=a.memberno 
    AND m.`type` = 3 
    AND a.marketshare < 75000 ;
  SET v_count = 1*v_count1 + 4*v_count2 + 10*v_count3 ;
  IF v_count > 0 
  THEN 
  SELECT 
    ROUND(v_typeprice/(10*v_count * 2),1),
    ROUND(v_typeprice/(10*v_count * 2),1) INTO v_avg_cash,
    v_avg_integral 
  FROM
    DUAL ;
  END IF ;
  ##市场分红奖励
  UPDATE 
    member_achievement a,member m
  SET
    a.getcash = a.getcash + 
    CASE
      WHEN (v_avg_cash + a.marketshare) > 5000 
      THEN (v_avg_cash + a.marketshare) - 5000 
      ELSE v_avg_cash 
    END,
    a.integral = a.integral + 
    CASE
      WHEN (v_avg_integral + a.marketinetegral) > 5000 
      THEN (v_avg_integral + a.marketinetegral) - 5000 
      ELSE v_avg_integral 
    END,
    a.marketinetegral = 
    CASE
      WHEN (v_avg_integral + a.marketinetegral) > 5000 
      THEN 5000 
      ELSE v_avg_integral + a.marketinetegral 
    END,
    a.marketshare = 
    CASE
      WHEN (v_avg_cash + a.marketshare) > 5000 
      THEN 5000 
      ELSE v_avg_cash + a.marketshare 
    END,
    a.newmarketinetegral = 
    CASE
      WHEN (v_avg_integral + a.marketinetegral) > 5000 
      THEN 0 
      ELSE v_avg_integral + a.newmarketinetegral 
    END,
    a.newmarketshare = 
    CASE
      WHEN (v_avg_cash + a.marketshare) > 5000 
      THEN 0 
      ELSE v_avg_cash + a.newmarketshare 
    END
 
  WHERE a.memberno=m.memberno AND m.bonus = 0 
    AND m.`type` = 1 
    AND a.marketshare < 5000 
    AND EXISTS 
    (SELECT 
      1 
    FROM
      member 
    WHERE recommmemberno = a.memberno) ;
  UPDATE 
    member_achievement a,member m 
  SET
    a.getcash = a.getcash + 
    CASE
      WHEN (v_avg_cash + marketshare) > 25000 
      THEN (v_avg_cash + marketshare) - 25000 
      ELSE v_avg_cash 
    END,
    a.integral = a.integral + 
    CASE
      WHEN (v_avg_integral + a.marketinetegral) > 25000 
      THEN (v_avg_integral + a.marketinetegral) - 25000 
      ELSE v_avg_integral 
    END,
    a.marketinetegral = 
    CASE
      WHEN (v_avg_integral + a.marketinetegral) > 25000 
      THEN 25000 
      ELSE v_avg_cash + a.marketinetegral 
    END,
        a.marketshare = 
    CASE
      WHEN (v_avg_cash + a.marketshare) > 25000 
      THEN 25000 
      ELSE v_avg_cash + a.marketshare 
    END ,
    a.newmarketinetegral = 
    CASE
      WHEN (v_avg_integral + a.marketinetegral) > 25000 
      THEN 0 
      ELSE v_avg_cash + a.newmarketinetegral 
    END,
    a.newmarketshare = 
    CASE
      WHEN (v_avg_cash + a.marketshare) > 25000 
      THEN 0 
      ELSE v_avg_cash + a.newmarketshare 
    END
  WHERE a.memberno=m.memberno AND m.bonus = 0 
    AND m.`type` = 2 ;
  UPDATE 
    member_achievement a,member m 
  SET
    a.getcash = a.getcash + 
    CASE
      WHEN (v_avg_cash + a.marketshare) > 75000 
      THEN (v_avg_cash + a.marketshare) - 75000 
      ELSE v_avg_cash 
    END,
    a.integral = a.integral + 
    CASE
      WHEN (v_avg_integral + a.marketinetegral) > 75000 
      THEN (v_avg_integral + a.marketinetegral) - 75000 
      ELSE v_avg_integral 
    END,
    a.marketinetegral = 
    CASE
      WHEN (v_avg_integral + a.marketinetegral) > 75000 
      THEN 75000 
      ELSE v_avg_cash + a.marketinetegral 
    END,
    a.marketshare = 
    CASE
      WHEN (v_avg_cash + a.marketshare) > 75000 
      THEN 75000 
      ELSE v_avg_cash + a.marketshare 
    END,
    a.newmarketinetegral = 
    CASE
      WHEN (v_avg_integral + a.marketinetegral) > 75000 
      THEN 0 
      ELSE v_avg_cash + a.newmarketinetegral 
    END,
    a.newmarketshare = 
    CASE
      WHEN (v_avg_cash + a.marketshare) > 75000 
      THEN 0 
      ELSE v_avg_cash + a.newmarketshare 
    END 
  WHERE a.memberno=m.memberno AND m.bonus = 0 
    AND m.`type` = 3 ;
  ##绩效分红和董事分红处理    
  TRUNCATE TABLE `fathermembernos` ;
  INSERT INTO fathermembernos (memberno) 
  SELECT 
    a.memberno 
  FROM
    member m,
    member_achievement a 
  WHERE m.bonus = 0 
    AND m.state = 1 
    AND a.memberno = m.memberno 
    AND allachievement > 200000 
    AND FIND_IN_SET(m.memberno, sTemp) > 0 
    AND a.memberno != membernos ;
  SET v_node10000 = '$' ;
  SET v_node10000count = 0 ;
  OPEN mycur ;
  myLoop :
  LOOP
    -- 提取游标里的数据,这里只有一个,多个的话也一样;
    FETCH mycur INTO v_memberno ;
    #CALL `accountAllYeji`(v_memberno,v_typeprice);
    SELECT 
      allachievement INTO v_jixiaoall 
    FROM
      member_achievement 
    WHERE memberno = v_memberno ;
    IF v_jixiaoall > 10000000 
    THEN 
    SELECT 
      COUNT(*) INTO v_child1000count 
    FROM
      member_achievement a,
      member m 
    WHERE a.memberno = m.memberno 
      AND m.state = 1 
      AND a.memberno IN 
      (SELECT 
        memberno 
      FROM
        member 
      WHERE recommmemberno = v_memberno) 
      AND allachievement > 1000000 ;
    IF v_child1000count > 0 
    THEN SET v_node10000 = CONCAT(v_node10000, v_memberno) ;
    SET v_node10000count = v_node10000count + 1 ;
    END IF ;
    ELSE ##处理20万
    IF v_jixiaoall > 200000 
    AND v_jixiaoall <= 1000000 
    THEN 
    SELECT 
      COUNT(*) INTO add20wchildcount 
    FROM
      member_achievement a,
      member m 
    WHERE a.memberno = m.memberno 
      AND m.state = 1 
      AND a.memberno IN 
      (SELECT 
        memberno 
      FROM
        member 
      WHERE recommmemberno = v_memberno) 
      AND allachievement > 2000000 ;
    IF add20wchildcount = 0 
    THEN SET add20wprice = v_typeprice ;
    IF v_jixiaoall - 200000 < v_typeprice 
    THEN SET add20wprice = v_jixiaoall - 200000 ;
    END IF ;
    IF add20wprice > 0 
    THEN 
    UPDATE 
      member_achievement 
    SET
      integral = integral + add20wprice * 0.08 * 0.1,
      newbmoney = newbmoney + add20wprice * 0.08 * 0.9,
            bmoney = bmoney + add20wprice * 0.08 * 0.9,
      getcash = getcash + add20wprice * 0.08 * 0.9 where memberno=v_memberno ;
    END IF ;
    END IF ;
    ##处理100万
    ELSEIF v_jixiaoall > 1000000 
    AND v_jixiaoall <= 3000000 
    THEN 
    SELECT 
      COUNT(*) INTO add100wchildcount 
    FROM
      member_achievement a,
      member m 
    WHERE a.memberno = m.memberno 
      AND m.state = 1 
      AND a.memberno IN 
      (SELECT 
        memberno 
      FROM
        member 
      WHERE recommmemberno = v_memberno) 
      AND allachievement > 10000000 ;
    IF add100wchildcount = 0 
    THEN SET add100wprice = v_typeprice ;
    IF v_jixiaoall - 1000000 < v_typeprice 
    THEN SET add100wprice = v_jixiaoall - 1000000 ;
    END IF ;
    IF add100wprice > 0 
    THEN IF add20wprice > 0 
    THEN 
    UPDATE 
      member_achievement 
    SET
      integral = integral + add20wprice * 0.04 * 0.1,
      newbmoney = newbmoney + add20wprice * 0.04 * 0.9,
            bmoney = bmoney + add20wprice * 0.04 * 0.9,
      getcash = getcash + add20wprice * 0.04 * 0.9 where memberno=v_memberno ;
    ELSE 
    UPDATE 
      member_achievement 
    SET
      integral =  integral + add20wprice * 0.12 * 0.1,
      newbmoney = newbmoney + add20wprice * 0.12 * 0.9,
            bmoney = bmoney + add20wprice * 0.12 * 0.9,
      getcash = getcash + add20wprice * 0.12 * 0.9 where memberno=v_memberno ;
    END IF ;
    END IF ;
    END IF ;
    ##处理300万
    ELSEIF v_jixiaoall > 3000000 
    AND v_jixiaoall <= 9000000 
    THEN 
    SELECT 
      COUNT(*) INTO add300wchildcount 
    FROM
      member_achievement a,
      member m 
    WHERE a.memberno = m.memberno 
      AND m.state = 1 
      AND a.memberno IN 
      (SELECT 
        memberno 
      FROM
        member 
      WHERE recommmemberno = v_memberno) 
      AND allachievement > 30000000 ;
    IF add300wchildcount = 0 
    THEN SET add300wprice = v_typeprice ;
    IF v_jixiaoall - 3000000 < v_typeprice 
    THEN SET add300wprice = v_jixiaoall - 3000000 ;
    END IF ;
    IF add300wprice > 0 
    THEN IF add20wprice > 0 
    OR add100wprice > 0 
    THEN 
    UPDATE 
      member_achievement 
    SET
      integral = integral + add20wprice * 0.04 * 0.1,
      newbmoney = newbmoney + add20wprice * 0.04 * 0.9,
            bmoney = bmoney + add20wprice * 0.04 * 0.9,
      getcash = getcash + add20wprice * 0.04 * 0.9 where memberno=v_memberno ;
    ELSE 
    UPDATE 
      member_achievement 
    SET
      integral = integral + add20wprice * 0.16 * 0.1,
      newbmoney = newbmoney + add20wprice * 0.16 * 0.9,
            bmoney = bmoney + add20wprice * 0.16 * 0.9,
      getcash = getcash + add20wprice * 0.16 * 0.9  where memberno=v_memberno ;
    END IF ;
    END IF ;
    END IF ;
    ##处理900万
    ELSEIF v_jixiaoall > 9000000 
    THEN 
    SELECT 
      COUNT(*) INTO add900wchildcount 
    FROM
      member_achievement a,
      member m 
    WHERE a.memberno = m.memberno 
      AND m.state = 1 
      AND a.memberno IN 
      (SELECT 
        memberno 
      FROM
        member 
      WHERE recommmemberno = v_memberno) 
      AND allachievement > 90000000 ;
    IF add900wchildcount = 0 
    THEN SET add900wprice = v_typeprice ;
    IF v_jixiaoall - 3000000 < v_typeprice 
    THEN SET add900wprice = v_jixiaoall - 9000000 ;
    END IF ;
    IF add900wprice > 0 
    THEN IF add20wprice > 0 
    OR add100wprice > 0 
    OR add300wprice > 0 
    THEN 
    UPDATE 
      member_achievement 
    SET
      integral = integral + add20wprice * 0.04 * 0.1,
      newbmoney = newbmoney + add20wprice * 0.04 * 0.9,
            bmoney = bmoney + add20wprice * 0.04 * 0.9,
      getcash = getcash + add20wprice * 0.04 * 0.9 where memberno=v_memberno ;
    ELSE 
    UPDATE 
      member_achievement 
    SET
      integral = integral + add20wprice * 0.2 * 0.1,
      newbmoney = newbmoney + add20wprice * 0.2 * 0.9,
            bmoney = bmoney + add20wprice * 0.2 * 0.9,
      getcash = getcash + add20wprice * 0.2 * 0.9 where memberno=v_memberno ;
    END IF ;
    END IF ;
    END IF ;
    END IF ;
    END IF ;
    -- 声明结束的时候
    IF done = 1 
    THEN LEAVE myLoop ;
    END IF ;
    -- 这里做你想做的循环的事件
  END LOOP myLoop ;
  -- 关闭游标
  CLOSE mycur ;
  UPDATE 
    member_achievement 
  SET
    getcash = getcash + ROUND((v_typeprice * 0.03) / v_node10000count,1),
    newdongshimoney = newdongshimoney + ROUND((v_typeprice * 0.03) / v_node10000count,1) 
  WHERE FIND_IN_SET(memberno, v_node10000) > 0 ;
END

© 著作权归作者所有

共有 人打赏支持
h
粉丝 0
博文 1
码字总数 1463
作品 0
私信 提问
Mysql与sql server的区别

由于工作的原因:上家公司的数据库全采用MySql,所以不得不用它。因此也学到了MySql的一些知识,但考虑到今后可能没机会使用了,所以想趁 现在离职在家休息,打算把这些东西整理一下,也为了...

未来十年
2012/01/12
0
0
mysql 新增字段时判断字段是否存在

1、问题引出 为了保证数据的正确性,代码的健壮性,我们必须对一些边界条件做一个判断,所以才会把修改表结构搞得如此复杂。 mysql 新增字段时判断字段是否存在,本来是一个很小的问题,因为...

learn_more
2016/04/01
1K
0
MySQL数据库新特性之存储过程入门教程

MySQL数据库新特性之存储过程入门教程 在MySQL 5中,终于引入了存储过程这一新特性,这将大大增强MYSQL的数据库处理能力。在本文中将指导读者快速掌握MySQL 5的存储过程的基本知识,带领用户...

vga
2014/07/21
0
0
wemall的3款三级分销微商城源码有什么区别呢?

Wemall作为国内较为知名的微商城源码品牌,在三级分销微商城源码这一块,一共有3款产品,很多顾客也会有疑问,那么这3款源码究竟要选择哪一款呢? 共同点 1.开发语言:thinkphp+mysql 2.源码...

wemall商城系统源码
2016/12/22
592
1
高并发 数据库操作比如插入,修改等解决办法

一般没有办法就是直接操作 数据库了,所以才需要分布式mysq等,必须有事务。但是如何并发太大还是不够的,解决方案:原子计数器---技术-- redis/noSQL记录用户行为消息--分布式MQ消费消息并落...

之渊
2016/08/07
454
0

没有更多内容

加载失败,请刷新页面

加载更多

使用正则表达式实现网页爬虫的思路详解

网页爬虫:就是一个程序用于在互联网中获取指定规则的数据。这篇文章主要介绍了使用正则表达式实现网页爬虫的思路详解,需要的朋友可以参考下 网页爬虫:就是一个程序用于在互联网中获取指定规...

前端小攻略
28分钟前
0
0
vue中锚点的三种方法

第一种: router.js中添加 mode: 'history', srcollBehavior(to,from,savedPosition){ if(to.hash){ return {selector:to.hash } } } 组件: <template><div><ul class="li......

peakedness丶
29分钟前
0
0
记一次面试最常见的10个Redis"刁难"问题

导读:在程序员面试过程中Redis相关的知识是常被问到的话题。作为一名在互联网技术行业打击过成百上千名的资深技术面试官,本文作者总结了面试过程中经常问到的问题。十分值得一读。 Redis在...

小刀爱编程
今天
20
0
TiDB Lab 诞生记 | TiDB Hackathon 优秀项目分享

本文由红凤凰粉凤凰粉红凤凰队的成员主笔,他们的项目 TiDB Lab 在本届 TiDB Hackathon 2018 中获得了二等奖。TiDB Lab 为 TiDB 培训体系增加了一个可以动态观测 TiDB / TiKV / PD 细节的动画...

TiDB
今天
5
0
当区块链遇到零知识证明

本文由云+社区发表 当区块链遇到零知识证明 什么是零知识证明 零知识证明的官方定义是能够在不向验证者任何有用的信息的情况下,使验证者相信某个论断是正确的。这个定义有点抽象,下面笔者举...

腾讯云加社区
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部