mysql层级表数据删除_【MySQL】无限层级数据表设计

需求:

用户A介绍B入会,B成为A的下线,B再发展C、D等下线,C、D也允许发展下线,不限制层级,但是每个人只允许有一个上线;

类似“传销”;

典型的树结构;

问题:

快速查询某人的所有上线;

快速查询某人的所有下线;

快速为某人增加一个下线;

方案有以下四种,各自的定义和利弊请看:前辈的文档

一、邻接表:依赖父节点

二、路径枚举

三、嵌套集

四、闭包表

现在,只针对 “闭包表” 设计,实现以上需求

-- 会员信息表

-- level 字段说明:相对于第一个用户的等级。

-- 譬如:用户A介绍B入会,B成为A的下线,由此用户A的等级是1,用户B的等级是2

CREATE TABLE IF NOT EXISTS `members` (

`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id',

`uid` INT(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '用户id',

`level` INT(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '会员等级',

`add_time` INT(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '创建时间',

PRIMARY KEY (`id`),

KEY `uid` (`uid`)

) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='会员信息表';

-- 会员级别关联表

CREATE TABLE IF NOT EXISTS `member_relation` (

`uid` INT(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '用户id',

`puid` INT(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT '阶梯等级上的用户id',

UNIQUE KEY `uid` (`uid`,`puid`),

KEY `uid_2` (`uid`),

KEY `puid` (`puid`)

) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT='会员级别关联表';

需求分析

-- 快速查询某人的所有上线:

SELECT * FROM members WHERE uid IN (SELECT puid FROM member_relation WHERE uid = '用户ID');

-- 快速查询某人的所有下线:

SELECT * FROM members WHERE uid IN (SELECT uid FROM member_relation WHERE puid = '用户ID');

-- 快速为某人增加一个下线:

INSERT INTO `members`(`uid`, `level`, `add_time`) VALUES ('用户ID', '上级用户等级+1', UNIX_TIMESTAMP());

INSERT INTO `member_relation`(`uid`, `puid`) SELECT '用户ID' AS uid,puid FROM member_relation WHERE uid = '上级用户ID';

INSERT INTO `member_relation`(`uid`, `puid`) VALUES ('用户ID', '上级用户ID');

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值