三级分销(栏目无限极分类)数据库设计

本文详细探讨了三种处理数据库用户层级关系的方法,包括递归查询的SQL示例、利用中间关系表避免性能问题以及计算返佣的示例。同时,文中还提及了不同数据结构对性能的影响和计算返佣的不同策略。
摘要由CSDN通过智能技术生成

一,第一种数据结构

在这里插入图片描述

1. 查询方法,递归查询

- 获取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;

二,第二种数据结构,使用中间关系表

递归调用虽然也能处理,但是数据量大了很容易产生性能问题。如果再统计每个级别下会员的消费,收入统计时,需要和消费表关系查询,那就耗时更长。换个思路来,我再创建个表,记录用户等级从属关系,然后在生成新用户的时候插入一条新的关系记录就可以了。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,意思就是子id11是父id2的一级子
再往上找userid=2的数据的pid为1
在relation中插入一条数据 pid=1,cid=11,plevel=2,意思就是子id11是父id1的二级子
在这里插入图片描述

  • 查询用户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

在这里插入图片描述

第三种数据结构

在这里插入图片描述

  • 获取张三所有下级
select * from user where path like "-1-%";
  • 获取张三所有二级下级
select * from user where pid=1;
  • 获取张三所有孙子
select * from user where level=2 and path like "-1%";
  • 获取张三二孙子所有上级
select * from user where id=9;

查出来的path值使用 array_filter(explode('-', trim($path, '-'))); 即可获得父级数组

  • 计算张三所有返佣
    假如假设一级用户返佣10%,二级用户返佣5%,张三儿子花费500,张三大孙子花费1000,张三二孙子花费2500
//先获取所有二级子,然后再计算
select * from user where pid = 1;
select SUM(amount * 0.1) from orders where user_id in (2);
//获取所有三级子,然后再计算
select * from user where level=2 and path like "-1-%";
select SUM(amount * 0.05) from orders where user_id in (4,9);
  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
打开dns.37it.cn免费申请二级域名解析方可使用 否则会出现00002993错误 用替换工具ultrareplace,文本编辑工具:Notepad++ 下面是需要替换的地方 ceshi.vvei.cn 超级人脉管家 http://mp.weixin.qq.com/s?__biz=MzA4MTI1OTI1OA==&mid=212268202&idx=1&sn=581c81665c013e1ee5c01db440df2593#rd 这个到时候自己撰写一份新手指南替换 掉 http://123.com/index.php?g=Admin&m=Login&a=index 后台地址 admin admin888 微信管理>>自定义回复 修改 http://ceshi.vvei.cn/ 替换为 你的网站 1、数据库连接地址:Public\Conf\config.php 2、微信菜单修改:Public\Conf\button_config.php,然后“微信管理”-“菜单管理”-“重新生成菜单”。 另下面三行代码请修改: $link_config (还没有关注的,引导关注,点击“立即关注”进入微信文章) $config_good_pic (购买时,页面上面的产品图) $headimgurl (没有购买前的头部左上角LOGO) 3、公众号里面的支付授权目录:直接域名就可以 支付回调URL:直接域名就可以 告警通知URL:先空着 4、更“换推广二维码”图片,图片在根目录保持格式、名字不变。记得在服务器根目录/imgpublic里删除其它多余的图片,只留benbendou.jpg即可。 5、页面的CSS在这里改:Application\Tpl\App\default\Public\Static\css 6、如果头像出不来,可以把根目录的imgpublic文件夹权限设为777 7、微信支付前显示的图片: Application\Tpl\App\default\Public\Static\images\productsinfo.jpg 对应更改的文件:Application\Tpl\App\default\Index\pay.html 8、更改下单时的“备注”内容:Application\Tpl\App\default\Index\index.html 9、关于修改微信关注后回复的内容目录地址: Application\Lib\Action\Admin\WechatAction.class.php 可修改第249,263,267行,可修改中文汉字,不要修改参数代码。 =============================================================== 后台登录:http://您的域名/index.php?g=Admin 初始帐号:admin 密 码:admin888
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值