MySQL连表查询分组去重的实现示例


Posted in MySQL onJuly 01, 2021
目录
  • 业务逻辑
  • 数据表结构
  • 查询逻辑
  • SQL脚本
  • 脚本说明

业务逻辑

通过多种渠道将小程序的活动页链接发布出去,比如通过多多种短信附带链接( channel 就记为 sms1,sms2,sms3 ),或者海报上面贴微信小程序的二维码( channel 记为 qrcode1,qrcode2,qrcode3 ),线下会员通过扫描二维码也能进入小程序指定的活动页,亦或者是通过其他会员分享的小程序链接也可以进入小程序( channel 记为 share)。这些不同的进入方式在我这篇文章统称为不同的渠道,也就是提到的 channel 字段。从不同的渠道进入活动页就会产生一条页面访问记录。会被计入 page_view 这张表里。

会员进入小程序的指定活动页后,在页面上面触发一系列操作后,会得到相应的反馈,比如获得积分,或者获得优惠券等等。这步操作称为参与活动。这条数据会被记入 activity_record 这张表里。

现在呢,运营小姐姐要求得到一份数据报表。每位参与活动的会员是从什么时间,哪个渠道里面进活动的?

数据表结构

 

表名 member_id participate_time
activity_record 会员号 活动参与时间

 

表名 member_id channel view_time
page_view 会员号 渠道 页面访问时间

查询逻辑

因为每位会员只能参加一次活动,也就是活动期间只能获得过一次积分,或者领取过一次优惠券等等这种意思,也就是每位会员最多只会产生一条 activity_record 记录。

可是 page_view 这张表的记录方式就不一样了。会员可能既收到过短信链接,又扫描过活动二维码,又被好友分享过活动链接,这下,对于这位会员来说,就会产生多条页面访问记录,即在 page_view 里产生多条数据。

你想想,会员肯定是先通过某一个渠道进入到活动页面,才能去参加活动。也就是有多条 page_view 的数据,按照 view_time 倒序排列,总有一条的 view_time 是小于且最接近于 activity_record 的 participate_time,下一条 page_view 的 view_time 就会大于 activity_record 的 participate_time。

SQL脚本

select c.member_id,c.view_time,.channel from (
SELECT
 member_id,
 SUBSTRING_INDEX( GROUP_CONCAT( view_time ORDER BY view_time DESC ), ',', 1 ) AS view_time,
 SUBSTRING_INDEX( GROUP_CONCAT( channel ORDER BY channel DESC ), ',', 1 ) AS channel
FROM
 page_view a LEFT JOIN activity_record b
        on a.member_id = b.member_id
        where a.view_time < b.participate_time
GROUP BY
 member_id) c;

脚本说明

  • GROUP_CONCAT:通过使用distinct可以排除重复值; group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )
  • SUBSTRING_INDEX:字符串截取函数。substring_index(str,delim,count)。str:要处理的字符串;delim:分隔符;count:计数

到此这篇关于MySQL连表查询分组去重的实现示例的文章就介绍到这了,更多相关MySQL连表查询分组去重内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
详解MySQL 用户权限管理
Apr 20 MySQL
修改MySQL的数据库引擎为INNODB的方法
May 26 MySQL
MySQL下使用Inplace和Online方式创建索引的教程
May 26 MySQL
MySQL一些常用高级SQL语句
Jul 03 MySQL
mysql中varchar类型的日期进行比较、排序等操作的实现
Nov 17 MySQL
Mysql中一千万条数据怎么快速查询
Dec 06 MySQL
你真的会用Mysql的explain吗
Mar 31 MySQL
Mysql排查分析慢sql之explain实战案例
Apr 19 MySQL
WINDOWS下安装mysql 8.x 的方法图文教程
Apr 19 MySQL
mysql 子查询的使用
Apr 28 MySQL
mysql 体系结构和存储引擎介绍
May 06 MySQL
MySQL生成千万测试数据以及遇到的问题
Aug 05 MySQL
python中的mysql数据库LIKE操作符详解
Jul 01 #MySQL
解决Mysql的left join无效及使用的注意事项说明
mysql left join快速转inner join的过程
MySQL 十大常用字符串函数详解
Mysql中调试存储过程最简单的方法
Jun 30 #MySQL
mysql如何配置白名单访问
Jun 30 #MySQL
Mysql数据库按时间点恢复实战记录
You might like
PHP+JS无限级可伸缩菜单详解(简单易懂)
2007/01/02 PHP
PHP+MySQL 手工注入语句大全 推荐
2009/10/30 PHP
php中处理mysql_fetch_assoc返回来的数组 不用foreach----echo
2011/05/04 PHP
PHP程序级守护进程的实现与优化的使用概述
2013/05/02 PHP
邮箱正则表达式实现代码(针对php)
2013/06/21 PHP
Aster vs KG BO3 第三场2.19
2021/03/10 DOTA
让广告代码不再影响你的网页加载速度
2006/07/07 Javascript
浅析js设置控件的readonly与enabled属性问题
2013/12/25 Javascript
jQuery动态添加、删除元素的方法
2014/01/09 Javascript
JS获取文本框,下拉框,单选框的值的简单实例
2014/02/26 Javascript
JavaScript中的函数嵌套使用
2015/06/04 Javascript
jQuery拖动布局其结果保存到数据库
2015/10/09 Javascript
JS实现黑色风格的网页TAB选项卡效果代码
2015/10/09 Javascript
nodejs和C语言插入mysql数据库乱码问题的解决方法
2017/04/14 NodeJs
jQuery实现百度登录框的动态切换效果
2017/04/21 jQuery
nodeJS实现路由功能实例代码
2017/06/08 NodeJs
详解Vue2.0 事件派发与接收
2017/09/05 Javascript
vue路由导航守卫和请求拦截以及基于node的token认证的方法
2019/04/07 Javascript
使用Vue开发自己的Chrome扩展程序过程详解
2019/06/21 Javascript
vue中npm包全局安装和局部安装过程
2019/09/03 Javascript
使用Python编写类UNIX系统的命令行工具的教程
2015/04/15 Python
Python简单计算文件夹大小的方法
2015/07/14 Python
python实现域名系统(DNS)正向查询的方法
2016/04/19 Python
python利用7z批量解压rar的实现
2019/08/07 Python
Python安装tar.gz格式文件方法详解
2020/01/19 Python
python使用nibabel和sitk读取保存nii.gz文件实例
2020/07/01 Python
办公室文书岗位职责
2013/12/16 职场文书
后备干部考察材料
2014/02/12 职场文书
心理健康活动总结
2014/04/30 职场文书
优秀员工评优方案
2014/06/13 职场文书
总经理检讨书
2014/09/15 职场文书
2014年领班工作总结
2014/11/25 职场文书
工作态度恶劣检讨书
2015/05/06 职场文书
学校禁毒宣传活动总结
2015/05/08 职场文书
幼儿园中班教学反思
2016/03/03 职场文书
2019新员工心得体会
2019/06/25 职场文书