无限层级拉新,数据建立和数据分析 php
2021年4月19日18:40:54
关于用户拉新活动,如果在活动开始之初,设计的时候没有做好用户关系处理的话,那就涉及统计的时候就是一个很麻烦的事情。
如果你刚好拉新员工的用户也是在这个表,需要筛选非员工的裂变用户数据就更麻烦了,因为这个是一个树状结构的,需要过滤掉员工数据,那就更蛋疼了,到现在我都没找到什么有效统计数据的办法,只能用简单的迭代查询数据库的办法来处理数据
然后通过一些非常规方式来查询数据库
调用服务
ini_set('memory_limit', '1024M');$u = UUser::select(['id', 'phone', 'invite_people_id'])->orderBy('id', 'asc')->get()->toArray();if (!empty($u)) {foreach ($u as $k => $v) {$p = new PullNewRelationshipService(); $p->runUserInvitRelationship($v);}}
class PullNewRelationshipService extends Base {public $data;public function __construct() {$this->data = new SplStack();}/** 跑业务数据用户注册邀请关系* 是否是用户ID是员工单独跑*/public function runUserInvitRelationship(array $data = [], array $ids = []) {//插入$uir = new UUserInvitRelationship();if ($data['invite_people_id'] == 0) {//如果invite_people_id 等于0说明是自己注册的直接写入$uir->user_id = $data['id'];$uir->level = 1;$uir->save();} else {$this->recursionUserData($data['invite_people_id']);
// p($this->data);//重置指针$this->data->rewind();$path = '';$i = 1;$run = [];while ($this->data->valid()) {$i++;
// echo $this->data->current(), "\n";$path = $path . ',' . $this->data->current();$run[] = $this->data->current();$this->data->next();}
// pp($upper_level_id);$uir->user_id = $data['id'];$uir->level = $i;$uir->level_path = trim($path, ',');$uir->upper_user_id = end($run);$uir->root_user_id = reset($run);$uir->save();}}//递归u_user表数据,向上递归public function recursionUserData(int $user_id = 0) {if ($user_id == 0) {return;}$u = UUser::where('id', $user_id)->first();if ($u == null) {} else {$this->data->push($u->id);$this->recursionUserData($u->invite_people_id);}}
数据库结构:
CREATE TABLE `u_user_invit_relationship` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,`create_time` datetime DEFAULT NULL COMMENT '创建时间',`update_time` datetime DEFAULT NULL COMMENT '更新时间',`remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '备注',`is_delete` tinyint(1) NOT NULL DEFAULT '10' COMMENT '10默认99删除',`is_show` tinyint(1) NOT NULL DEFAULT '10' COMMENT '10默认显示99不显示',`user_id` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT '用户ID',`level` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '层级级别0是默认从1层',`level_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '层级路径例如id,id,id',`upper_user_id` bigint(20) DEFAULT '0' COMMENT '上层级别ID',`root_user_id` bigint(20) DEFAULT '0' COMMENT '层级根用户ID',PRIMARY KEY (`id`),UNIQUE KEY `user_id` (`user_id`),KEY `level_path` (`level_path`)
) ENGINE=InnoDB AUTO_INCREMENT=404862 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户注册邀请关系表'
是从下到上的建立结构,查询sql
405,500,758,1753,这个是level_path数据结构
查询用户裂变数据SQL
SELECT count(*) FROM u_user_invit_relationship WHERE FIND_IN_SET(405,level_path)
性能还行比IN好
SELECT count(*) FROM u_user_invit_relationship WHERE 405 in(level_path);
如果你需要从上到下的过滤,有些东西,比如员工数据剔除,就只能从上到下剔除,想在上面 的建立的数据结构上去过滤,目前我没发现什么好办法
$mc = McStaffPullNewTask::select(['weixin_phone'])->get()->toArray();$weixinPhones = array_column($mc, 'weixin_phone');$ids = UUser::whereIn('phone', $weixinPhones)->get()->toArray();$idArray = array_column($ids, 'id');// $md = McStaffPullNewTask::orderBy('id', 'asc')->limit(10)->get();$md = McStaffPullNewTask::orderBy('id', 'asc')->get();foreach ($md as $k => $v) {$t = new StaffRelationshipService();$count = $t->runUserInvitRelationship($v->weixin_phone, $idArray);$v->staff_pull_new = $count;$v->save();}
class StaffRelationshipService extends Base {public $data;public function __construct() {$this->data = new SplStack();}//跑业务数据用户注册邀请关系public function runUserInvitRelationship(int $phone = null, array $staffIdArray = []) {$uUser = UUser::where('phone', $phone)->first();
// pp($uUser);if ($uUser == null) {
// p('用户未找到');return 0;} else {$key = array_search($uUser->id, $staffIdArray);if ($key !== null) {unset($staffIdArray[$key]);}$u = UUser::where('invite_people_id', $uUser->id)->whereNotIn('id', $staffIdArray)->get()->toArray();
// p(count($u));$this->recursionUserData($u, $staffIdArray);
// p($this->data);
// //重置指针$this->data->rewind();$count = [];while ($this->data->valid()) {$count[] = $this->data->current();$this->data->next();}
// p(array_sum($count));return array_sum($count);}}//递归u_user表数据,向上递归public function recursionUserData(array $ids = [], array $staffIdArray = []) {if (!empty($ids)) {$this->data->push(count($ids));foreach ($ids as $k => $v) {$key = array_search($v['id'], $staffIdArray);if ($key !== null) {unset($staffIdArray[$key]);}$ss = UUser::where('invite_people_id', $v['id'])->whereNotIn('id', $staffIdArray)->get();$this->recursionUserData($ss->toArray(), $staffIdArray);}}}
无限层级拉新,数据建立和数据分析 php相关推荐
- 用mescroll实现无限上拉增加数据,下拉刷新数据 (学习笔记)
最近自己做一个web app需要用到上拉查询下页数据,网上看了很多很多帖子,发现并不能快速的套用,总是会出现各种问题无法使用,于是无奈自己跑去看了官方api文档,终于做了出来,至此做个笔记,以后用到可 ...
- 增长复盘|我们在小程序实现裂变!日拉新1000+
Kevin改变世界的点滴 Kevin改变世界的点滴 昨天 大家好,我是Kevin.这是2019年第48篇原创 PMTalk产品经理社区2019年第5篇增长复盘 关于PMTalk产品经理社区的裂变与增长 ...
- easyUI-树形菜单(ComboTree) 无限层级树实现方式(1.0版本)
对于easyUI实现一个树,是一件很简单的事情,实现形式很多.这里作者将实现,通过数据库获取数据,再将数据通过递归形式装成无限层级json数据,到达无限成级的树结构.需要用到的json插件建附件,希望 ...
- boot spring 简拼_超牛逼的下拉字典框架,支持拼音简拼搜索,代码项、代码值搜索,无限层级级联,多选、过滤自定义数据表等等...
Dic扩展模块 Dic数据字典模块是v-ci的核心之一,为解决大数据量下拉字典效率及操作问题,特推出通用的数据字典模块,所有字典数据可在数据库维护,在大数据量时采用分页下拉的展示方式,同时支持拼音简拼 ...
- 数据分享|Python决策树、随机森林、朴素贝叶斯、KNN(K-最近邻居)分类分析银行拉新活动挖掘潜在贷款客户...
原文链接:http://tecdat.cn/?p=23518 项目背景:银行的主要盈利业务靠的是贷款,这些客户中的大多数是存款大小不等的责任客户(存款人).银行拥有不断增长的客户(点击文末" ...
- 怎么获取codeforces的数据_手把手教你学会新媒体运营——如何通过数据分析来优化新媒体运营...
一般来说,我们希望运营的新媒体的每篇内容都可以获得高打开率和高分享率.但事实并不总是如愿,因此,在新媒体运营过程当中,我们需要不断地优化自身内容,以求可以获得更多的关注和流量.那么我们今天来讨论下如何 ...
- python新冠病毒COVID-19数据分析和数据可视化
在全球范围内,截至2021 年 11 月 15 日欧洲中部时间下午 4:30,各国已向世卫组织报告了253,163,330(2.5亿)例COVID-19确诊病例,包括5,098,174(5百万)例死亡 ...
- 人力资源数据分析 - case 分析拉钩数据分析师岗位
一.背景 本人5年工作经验,服务同一家公司,也一直在与数据打交道.曾在XX事业部-业务策略中心带数据小组,进行扩店策略.门店运营和经营指标体系建设.目前在我司研究院做BI.数据挖掘.近期正在寻求改变, ...
- 优惠券运营指南:一张搞定拉新、促活、转化、召回
作者:学运营就来 运营小咖秀 优惠券能够起到很好的拉新和激活用户的作用,因此受到了很多商家的青睐.而用户也逐渐养成了先领券再下单的消费习惯. 淘宝购物先看有没有优惠券可以领 在美团订餐会先领一个满减红 ...
最新文章
- 零基础学stm32要多久?stm32应该怎么学?
- Oracle truncate table 与 delete tabel的区别(转)
- 怎样让友情链接更加有效果
- android 十八 蓝牙及Wi-Fi
- 程序员的思维修炼》读书笔记
- AOS V0.8 发布,JavaEE 应用基础平台
- java对日开发好跳槽么_国内 Java 开发者必备的两个装备,你配置上了么?
- 搭上信息化火箭,文档管理也要跟上潮流
- JavaScript【面向对象】-静态方法-私有方法-公有方法-特权方法
- springmvc或者springboot 中实现跨域的5种方式
- 【强推】10个有趣的Python程序
- 西门子转以太网模块连接S7-300以太网驱动
- 业界安全事件最新动态
- 手机上的python编辑器_菜鸟教程在线编辑器|菜鸟教程app手机版下载(html/java/python3)v1.0-乐游网安卓下载...
- 电商盲返模式的核心玩法
- Vue-router的使用(vue3.0版本)
- 同时拥有多个子域名和主域名?推荐申请GlobalSign SANs SSL证书
- WLAN驱动分析文档_gzc126_新浪博客
- SHEEL-远程调用执行命令模板
- 兔老大的系统设计(二)定时系统(延时队列)