三级分销数据库设计

news2024/11/17 19:49:45

一,数据结构

在这里插入图片描述

二,查询方法

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

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

SELECT
	T2.* 
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 
	) T1
	JOIN sj_user T2 ON T1._id = T2.id 
ORDER BY
	id ASC;
  • 查询子节点最上三级的父节点

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

SELECT
	T2.*,
	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 
	) T1
	JOIN sj_user T2 ON T1._id = T2.id 
WHERE
	T1.plevel > 0 
	AND T1.plevel <= 3 
ORDER BY
	id ASC;
  • 父节点查询出下面所有的子节点
SELECT
	t3.* 
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 
WHERE
	child_id != 0;

  • 查询节点的最近三代子节点

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

SELECT
	T2.*,
	T1.clevel 
FROM
	(
	SELECT
		@r AS _pid,
		(
		SELECT
			@r := group_concat( id ) 
		FROM
			`sj_user` 
		WHERE
		FIND_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 
	) T1
	INNER JOIN sj_user T2 ON FIND_IN_SET( T2.pid, T1._pid ) 
WHERE
	T1.clevel <= 3 
ORDER BY
	id 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.coloradmin.cn/o/1488650.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣61:旋转链表

题目 给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], k 2输出&#xff1a;[4,5,1,2,3] 示例 2&#xff1a; 输入&#xff1a;head [0,1,2], k 4输出&#xff1a;…

Revit-二开之立面视图创建FilledRegion-(3)

在上一篇博客中介绍了FilledRegion的创建方法,这种方法通常只在平面视图中适用,在三维视图中也是无法创建的(目前研究的是这样的,如果有其他方法,请赐教)。 本片文章介绍一个下在立面视图中创建FilledRegion的方法,主要操作是在立面视图中拾取一个点,然后以该点为原点,…

【单调栈】Leetcode 739.每日温度

【单调栈】Leetcode 739.每日温度 解法&#xff1a;维护单调栈栈中存的是数组的索引 解法&#xff1a;维护单调栈栈中存的是数组的索引 栈中存的是数组的索引 当新的值比当前栈顶的大&#xff0c;那么就执行出栈-更新result数组-判断当新的值比当前栈顶的大&#xff1f;的循环…

【Java设计模式】四、原型设计模式

文章目录 1、原型设计模式2、深克隆和浅克隆 1、原型设计模式 说明&#xff1a; 用一个原型对象&#xff0c;创建和原型对象相同的对象&#xff0c;以能够保证创建对象的性能是创建大量相同对象的最佳方式 使用场景&#xff1a; 对象的创建非常复杂&#xff0c;可以使用原型…

前端学习第六天-css浮动和定位

达标要求 了解浮动的意义 掌握浮动的样式属性 熟练应用清除浮动 熟练掌握定位的三种方式 能够说出网页布局的不同方式的意义 1. 浮动(float) 1.1 CSS 布局的三种机制 网页布局的核心——就是用 CSS 来摆放盒子。CSS 提供了 3 种机制来设置盒子的摆放位置&#xff0c;分…

复现 CVE-2020-9548:Jackson-databind

1、编译Exploit.java Java版本使用的是&#xff1a; Exploit.java代码如下&#xff1a; import java.lang.Runtime;public class Exploit {static {try {Runtime.getRuntime().exec("calc");} catch (Exception e) {e.printStackTrace();}} }对Exploit.java进行编译…

代码随想录训练营第36天 | LeetCode 435. 无重叠区间、​​​​​​LeetCode 763.划分字母区间、LeetCode 56. 合并区间

目录 LeetCode 435. 无重叠区间 文章讲解&#xff1a;代码随想录(programmercarl.com) 视频讲解&#xff1a;贪心算法&#xff0c;依然是判断重叠区间 | LeetCode&#xff1a;435.无重叠区间_哔哩哔哩_bilibili 思路 ​​​​​​LeetCode 763.划分字母区间 文章讲解&…

[GYCTF2020]EasyThinking --不会编程的崽

看标题就知道&#xff0c;这大概率是关于thinkphp的题目。先尝试错误目录使其报错查看版本号 thinkphp v6.0.0&#xff0c;在网上搜索一下&#xff0c;这个版本有一个任意文件上传漏洞。参考以下文章。 https://blog.csdn.net/god_zzZ/article/details/104275241 先注册一个账…

Java SE:反射

反射作用 获取字节码文件里面的所有信息&#xff0c;包括构造方法、成员、成员方法&#xff0c;以及修饰他们的修饰符、类型和方法的返回值等等&#xff0c;只要是类里面的内容都能获取&#xff0c;获取之后可以动态的调用方法&#xff0c;动态的创建对象 获取类字节码文件对象…

回溯难题(算法村第十八关黄金挑战)

复原 IP 地址 93. 复原 IP 地址 - 力扣&#xff08;LeetCode&#xff09; 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。 例如&#xff1a;"0.1.2.201" 和 &q…

MATLAB读取txt文本数据及可视化指南

MATLAB读取txt文本数据的说明指南 目录 MATLAB读取txt文本数据的说明指南摘要1. 数据准备2. 读取数据3. 绘制图形4. 小结 摘要 在MATLAB中&#xff0c;读取txt文本格式文件数据是一项基本的操作&#xff0c;特别是在数据分析和可视化方面。本文将介绍如何使用MATLAB读取txt文本…

Socket网络编程(二)——UDP快速入门

目录 UDP相关概念UDP是什么为什么不可靠UDP能做什么UDP包最大长度 UDP单播、广播、多播概念1. 单播、广播、多播模型图2. ip地址分类3. 子网掩码的作用&#xff1a;4. 广播地址5. 网段划分6. 变长子网掩码 UDP核心APIAPI-DatagramSocketDatagramSocket构造方法DatagramSocket常…

Redis 淘汰策略、持久化、高可用

淘汰策略 只有 redis 内存空间已满并且往里面写新数据&#xff0c;才会触发淘汰策略。通过 expire / / /pexpire 让 key-value 过期&#xff0c;从而让 redis 清除这个 key-value。value 的数据结构typedef struct redisObject {unsigned tpye:4;unsigned encoding:4;// 判断哪…

C语言初阶—数组

数组是一组相同类型元素的集合。 在C99标准之前&#xff0c;数组的大小必须是常量或常量表达式。 在C99标准之后&#xff0c;数组的大小可以是变量&#xff0c;可以支持变长数组&#xff0c;但变长数组不能初始化。 不完全初始化&#xff0c;剩余的元素默认初始化为0 。 数组访…

【Unity】Node.js安装与配置环境

引言 我们在使用unity开发的时候&#xff0c;有时候会使用一些辅助工具。 Node.js就是开发中&#xff0c;经常会遇到的一款软件。 1.下载Node.js 下载地址&#xff1a;https://nodejs.org/en 2.安装Node.js ①点击直接点击Next下一步 ②把协议勾上&#xff0c;继续点击…

帝恩思SSL证书助力工业领域数据安全保护能力,助力企业高质量发展

为加快提升工业领域数据安全保护能力&#xff0c;助力工业高质量发展&#xff0c;夯实新型工业化发展的安全基石&#xff0c;2024年2月26日&#xff0c;工业和信息化部发布了《工业领域数据安全能力提升实施方案&#xff08;2024-2026年&#xff09;》。 在方案中提出以落实企…

Nodejs 第四十四章(redis基本使用)

字符串的操作 SET key value [NX|XX] [EX seconds] [PX milliseconds] [GET]key&#xff1a;要设置的键名。value&#xff1a;要设置的值。NX&#xff1a;可选参数&#xff0c;表示只在键不存在时才设置值。XX&#xff1a;可选参数&#xff0c;表示只在键已经存在时才设置值。…

七款顶级API测试工具

在现代软件开发中&#xff0c;API接口已成为不可或缺的核心组件。鉴于API缺乏直观的图形用户界面&#xff08;GUI&#xff09;&#xff0c;使得直接对接口进行测试变得困难&#xff0c;对于前后端开发者而言&#xff0c;选择一套高效且实用的工具来测试API接口&#xff0c;从而…

g2o -- curve_fit代码解析

概述 本文介绍通过g2o框架&#xff0c;优化点和曲线的匹配&#xff08;曲线拟合&#xff09;。曲线的公式如下所示&#xff1a; 它有三个参数&#xff1a;a, b, lamba。 代码解析 自定义顶点 /*** \brief the params, a, b, and lambda for a * exp(-lambda * t) b*/ clas…

【AWS Credit】AWS服务抵扣金额兑换操作步骤演示说明

AWS 服务抵扣金额可应用于账单&#xff0c;帮助支付与符合条件的服务相关联的成本。服务抵扣金额在用尽或过期之前均可应用。 文章目录 AWS Credit 使用说明1.登录到AWS控制台2.导航至“账单和成本管理”3.点击“积分”&#xff0c;选择“兑换积分”4.输入优惠代码及安全代码5.…