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相关推荐

  1. 用mescroll实现无限上拉增加数据,下拉刷新数据 (学习笔记)

    最近自己做一个web app需要用到上拉查询下页数据,网上看了很多很多帖子,发现并不能快速的套用,总是会出现各种问题无法使用,于是无奈自己跑去看了官方api文档,终于做了出来,至此做个笔记,以后用到可 ...

  2. 增长复盘|我们在小程序实现裂变!日拉新1000+

    Kevin改变世界的点滴 Kevin改变世界的点滴 昨天 大家好,我是Kevin.这是2019年第48篇原创 PMTalk产品经理社区2019年第5篇增长复盘 关于PMTalk产品经理社区的裂变与增长 ...

  3. easyUI-树形菜单(ComboTree) 无限层级树实现方式(1.0版本)

    对于easyUI实现一个树,是一件很简单的事情,实现形式很多.这里作者将实现,通过数据库获取数据,再将数据通过递归形式装成无限层级json数据,到达无限成级的树结构.需要用到的json插件建附件,希望 ...

  4. boot spring 简拼_超牛逼的下拉字典框架,支持拼音简拼搜索,代码项、代码值搜索,无限层级级联,多选、过滤自定义数据表等等...

    Dic扩展模块 Dic数据字典模块是v-ci的核心之一,为解决大数据量下拉字典效率及操作问题,特推出通用的数据字典模块,所有字典数据可在数据库维护,在大数据量时采用分页下拉的展示方式,同时支持拼音简拼 ...

  5. 数据分享|Python决策树、随机森林、朴素贝叶斯、KNN(K-最近邻居)分类分析银行拉新活动挖掘潜在贷款客户...

    原文链接:http://tecdat.cn/?p=23518 项目背景:银行的主要盈利业务靠的是贷款,这些客户中的大多数是存款大小不等的责任客户(存款人).银行拥有不断增长的客户(点击文末" ...

  6. 怎么获取codeforces的数据_手把手教你学会新媒体运营——如何通过数据分析来优化新媒体运营...

    一般来说,我们希望运营的新媒体的每篇内容都可以获得高打开率和高分享率.但事实并不总是如愿,因此,在新媒体运营过程当中,我们需要不断地优化自身内容,以求可以获得更多的关注和流量.那么我们今天来讨论下如何 ...

  7. python新冠病毒COVID-19数据分析和数据可视化

    在全球范围内,截至2021 年 11 月 15 日欧洲中部时间下午 4:30,各国已向世卫组织报告了253,163,330(2.5亿)例COVID-19确诊病例,包括5,098,174(5百万)例死亡 ...

  8. 人力资源数据分析 - case 分析拉钩数据分析师岗位

    一.背景 本人5年工作经验,服务同一家公司,也一直在与数据打交道.曾在XX事业部-业务策略中心带数据小组,进行扩店策略.门店运营和经营指标体系建设.目前在我司研究院做BI.数据挖掘.近期正在寻求改变, ...

  9. 优惠券运营指南:一张搞定拉新、促活、转化、召回

    作者:学运营就来 运营小咖秀 优惠券能够起到很好的拉新和激活用户的作用,因此受到了很多商家的青睐.而用户也逐渐养成了先领券再下单的消费习惯. 淘宝购物先看有没有优惠券可以领 在美团订餐会先领一个满减红 ...

最新文章

  1. 零基础学stm32要多久?stm32应该怎么学?
  2. Oracle truncate table 与 delete tabel的区别(转)
  3. 怎样让友情链接更加有效果
  4. android 十八 蓝牙及Wi-Fi
  5. 程序员的思维修炼》读书笔记
  6. AOS V0.8 发布,JavaEE 应用基础平台
  7. java对日开发好跳槽么_国内 Java 开发者必备的两个装备,你配置上了么?
  8. 搭上信息化火箭,文档管理也要跟上潮流
  9. JavaScript【面向对象】-静态方法-私有方法-公有方法-特权方法
  10. springmvc或者springboot 中实现跨域的5种方式
  11. 【强推】10个有趣的Python程序
  12. 西门子转以太网模块连接S7-300以太网驱动
  13. 业界安全事件最新动态
  14. 手机上的python编辑器_菜鸟教程在线编辑器|菜鸟教程app手机版下载(html/java/python3)v1.0-乐游网安卓下载...
  15. 电商盲返模式的核心玩法
  16. Vue-router的使用(vue3.0版本)
  17. 同时拥有多个子域名和主域名?推荐申请GlobalSign SANs SSL证书
  18. WLAN驱动分析文档_gzc126_新浪博客
  19. SHEEL-远程调用执行命令模板
  20. 兔老大的系统设计(二)定时系统(延时队列)

热门文章

  1. windos 为什么会突然服务停止了_Win7系统print spooler服务老是自动停止怎么办
  2. 离职入职过渡期,你的社保谁负责?
  3. 外贸业务全套英文邮件范文(转)
  4. python第一天作业
  5. 编写递归算法,计算二叉树中叶子结点的数目
  6. 如何修改Oracle表中的数据
  7. word 定义自动编号
  8. matlab中lg怎么打开,在 matlab怎么表示lg10
  9. Webstorm 2019激活码
  10. Direct2D将当前呈现器目标内容保存为位图