三级分销数据库设计

一,数据结构

在这里插入图片描述

二,查询方法

1.mysql递归查询
  • 获取id9的所有上级

@r := 9 设置自己所要搜索子节点的id

SELECTT2.* 
FROM(SELECT@r AS _id,( SELECT @r := pid FROM `sj_user` WHERE id = _id ) AS 2v2,@l := @l + 1 AS lvl FROM( SELECT @r := 9 ) vars, -- 查询id为9的所有上级sj_user h WHERE@r <> - 1 ) T1JOIN sj_user T2 ON T1._id = T2.id 
ORDER BYid ASC;
  • 查询子节点最上三级的父节点

其中,别名T2的表示原本的数据,而T1中的plevel即是父代的级别(1:直接父代,2:二级父代,3:三级父代)如果plevel为0,代表是查询的节点自身。

SELECTT2.*,T1.plevel
FROM(SELECT@r AS _id,( SELECT @r := pid FROM `sj_user` WHERE id = _id ) AS pid,@l := @l + 1 AS plevel FROM( SELECT @r := 9 ) vars,	-- 查询id为9的所有上级( SELECT @l :=- 1 ) plevel,sj_user h WHERE@r <> - 1 ) T1JOIN sj_user T2 ON T1._id = T2.id 
WHERET1.plevel > 0 AND T1.plevel <= 3 
ORDER BYid ASC;
  • 父节点查询出下面所有的子节点
SELECTt3.* 
FROM(SELECT*,IF( find_in_set( t1.pid, @p ), @p := concat( @p, ',', id ), 0 ) AS child_id FROM( SELECT * FROM sj_user t ORDER BY id ) t1,( SELECT @p := 4 ) t2 ) t3 
WHEREchild_id != 0;
  • 查询节点的最近三代子节点

@r := 1 为要查询的数据id

SELECTT2.*,T1.clevel 
FROM(SELECT@r AS _pid,(SELECT@r := group_concat( id ) FROM`sj_user` WHEREFIND_IN_SET( pid, _pid )) AS cid,@l := @l + 1 AS clevel FROM( SELECT @r := 1 ) vars,-- 查询id为1的所有子节点( SELECT @l := 0 ) clevel,sj_user h WHERE@r IS NOT NULL ) T1INNER JOIN sj_user T2 ON FIND_IN_SET( T2.pid, T1._pid ) 
WHERET1.clevel <= 3 
ORDER BYid ASC;
  1. 使用中间关系表
    递归调用虽然也能处理,但是数据量大了很容易产生性能问题。如果再统计每个级别下会员的消费,收入统计时,需要和消费表关系查询,那就耗时更长。换个思路来,我再创建个表,记录用户等级从属关系,然后在生成新用户的时候插入一条新的关系记录就可以了。pid是父级id,cid是子id,plevel是父级是子级的几层关系。
    关系表是在用户注册时产生的,且核心也是以新插入数据为基点,向上找。
    例如:用户id=2,名称为二级1-1 发展了一个下级。user表中新增一个用户自增主键id为11,通过推荐码找自己的上级是“二级1-1”且userid=2,
    对应关系就是user2增加了一个一级子11,user1增加了一个二级子11
    在relation中插入一条数据 pid=2,cid=11,plevel=1
    再往上找userid=2的数据的pid为1
    在relation中插入一条数据 pid=1,cid=11,plevel=2
    在这里插入图片描述
    查询用户1的所有下级,查出来的cid列就是结果
select * from sj_relation where pid=1

查询所有用户4的一级下线,查出来的cid列就是结果

select * from sj_relation where pid = 4 and plevel = 1;

查询用户10的所有父级,查出来的pid列就是结果

select * from sj_relation where cid=10

假如假设一级用户返佣10%,二级用户返佣5%,计算四号用户的所有返佣
在这里插入图片描述

SELECT sum(DECODE(r.plevel,1,o.amount*0.1,2,o.amount*0.05)) AS rebate_amount FROM sj_relation r, sj_order o WHERE o.user_id = r.cid AND r.pid = '4' and r.plevel > 0

某些mysql版本会报错

SELECT r.*,case when r.plevel=1 then o.amount*0.1 when r.plevel=2 then o.amount*0.05 else 0 end as backmoney from sj_relation r,sj_order o WHERE o.user_id = r.cid AND r.pid = '4' and r.plevel > 0

在这里插入图片描述

SELECT sum(case when r.plevel=1 then o.amount*0.1 when r.plevel=2 then o.amount*0.05 else 0 end) from sj_relation r,sj_order o WHERE o.user_id = r.cid AND r.pid = '4' and r.plevel > 0 GROUP BY r.pid

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/512661.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言 BMP图片的旋转与缩放

目录 一、bmp文件头、文件信息头、位图实际数据的数据结构定义 二、源BMP文件信息的读取 三、实际位图数据的旋转、缩放操作 四、生成转换过后的新位图文件 #include <stdlib.h> #ifndef PHOTODEAL_H #define PHOTODEAL_H #pragma pack(1) typedef struct tagBm…

基于React低代码平台开发:构建高效、灵活的应用新范式

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&…

Qt 实现橡皮擦拭显示图片

1.简介 在一些游戏中看见类似解密破案的效果&#xff0c;使用手触摸去擦拭图片上的灰尘&#xff0c;然后显示最终的图片&#xff0c;所以也想试试Qt实现的效果。大家有自己想做的效果&#xff0c;都可以尝试。 以下是效果展示图。 可以控制橡皮擦的大小&#xff0c;进行擦拭…

资深测试总结,接口自动化测试常用配置文件(超细整理)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、常用的配置文件…

洗地机怎么选?2024年洗地机推荐,希亦、添可、追觅、石头哪一款清洁力更好?

洗地机是一款可以一遍搞定扫地和拖地一系列动作的清洁神奇&#xff0c;它能让我们真实的感受到打扫屋子是一件很减压的事情&#xff0c;但是目前市面上的洗地机太多了&#xff0c;大家都不知道怎么样的才算好&#xff0c;希亦、添可、追觅、石头洗地机值不值得买&#xff1f;我…

使用CSS制作动态的环形图/饼图

使用纯 CSS Animation conic-gradient 实现一个环形图。 饼图的实现思路和环形图一样&#xff0c;去掉中间的圆形遮盖 after 伪类元素即可。 一、构建基础样式 构建圆形节点和中间的遮盖元素。 <style>body {background-color: rgb(130, 226, 255);}.circle {top: 16…

5年爬到半山腰,我后悔了吗?

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 软件测试是一个付出就有回报的工作&#xff0c;可能很多人会说软…

摄像头拉流低延迟(90ms内)实践和技术讲解

背景 作为网络摄像头拉流客户端&#xff0c;或者其他类型的流媒体播放而言&#xff0c;低延迟总是我们追求的重点性能要素。有一些低延迟方法可以在推流端设置&#xff0c;但倘若像摄像头这种场景&#xff0c;根本就无法控制摄像头端的自身延迟&#xff0c;只能从接收端动手。…

vs2022 qt 关于lnk2001和2019同时报错的问题

需要像qt中添加模块&#xff0c;这里&#xff0c;缺少qtopenglwidgets模块

前端- 基础 表单标签 - 使用场景及组成

大家都有到银行去办理业务的时候&#xff0c;大多数情况下会填一些 纸质的表之类的东西如下图 而我们在网页中也会经常遇到 像现实生活中在银行填表那样的情景&#xff0c;如下图 &#xff1a; 上示就是 网页中的表单的使用场景了 表单标签 &#xff1a; 为什么需要表单 …

llvm AST consumer 示例

示例源码 Makefile LLVM_CONFIG ? llvm-config #CXX : clang ifndef VERBOSE QUIET : endifSRC_DIR ? $(PWD) LDFLAGS $(shell $(LLVM_CONFIG) --ldflags) COMMON_FLAGS -Wall -Wextra CXXFLAGS $(COMMON_FLAGS) $(shell $(LLVM_CONFIG) --cxxflags) LCXX :$(shell $(L…

P1160 队列安排题解

题目 一个学校里老师要将班上N个同学排成一列&#xff0c;同学被编号为1∼N&#xff0c;他采取如下的方法&#xff1a; 先将1号同学安排进队列&#xff0c;这时队列中只有他一个人&#xff1b; 2∼N号同学依次入列&#xff0c;编号为i的同学入列方式为&#xff1a;老师指定编…