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 05 MySQL
带你学习MySQL执行计划
May 31 MySQL
Unity连接MySQL并读取表格数据的实现代码
Jun 20 MySQL
MySQL 开窗函数
Feb 15 MySQL
Arthas排查Kubernetes中应用频繁挂掉重启异常
Feb 28 MySQL
关于k8s环境部署mysql主从的问题
Mar 13 MySQL
MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法
Apr 18 MySQL
mysql字段为NULL索引是否会失效实例详解
May 30 MySQL
MySQL选择合适的备份策略和备份工具
Jun 01 MySQL
Mysql中@和@@符号的详细使用指南
Jun 05 MySQL
MySQL数据库之存储过程 procedure
Jun 16 MySQL
MySQL中TIMESTAMP类型返回日期时间数据中带有T的解决
Dec 24 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统计文件大小,以GB、MB、KB、B输出
2011/05/29 PHP
浅析php面向对象public private protected 访问修饰符
2013/06/30 PHP
php下foreach提示Warning:Invalid argument supplied for foreach()的解决方法
2014/11/11 PHP
PHP获取当前文件的父目录方法汇总
2016/07/21 PHP
php分页查询mysql结果的base64处理方法示例
2017/05/18 PHP
JQuery获取当前屏幕的高度宽度的实现代码
2011/07/12 Javascript
javascript日期对象格式化为字符串的实现方法
2014/01/14 Javascript
javascript中offset、client、scroll的属性总结
2015/08/13 Javascript
12个超实用的JQuery代码片段
2015/11/02 Javascript
javascript简单判断输入内容是否合法的方法
2016/05/11 Javascript
jQuery学习笔记之入门
2016/12/14 Javascript
JavaScript登录记住密码操作(超简单代码)
2017/03/22 Javascript
NodeJS、NPM安装配置步骤(windows版本) 以及环境变量详解
2017/05/13 NodeJs
Js实现京东无延迟菜单效果实例(demo)
2017/06/02 Javascript
详解vue.js 开发环境搭建最简单攻略
2017/06/12 Javascript
js技巧之十几行的代码实现vue.watch代码
2018/06/09 Javascript
layui获取多选框中的值方法
2018/08/15 Javascript
详解如何使用微信小程序云函数发送短信验证码
2019/03/13 Javascript
Vue项目打包编译优化方案
2020/09/16 Javascript
python变量不能以数字打头详解
2016/07/06 Python
Python 异常处理的实例详解
2017/09/11 Python
python使用time、datetime返回工作日列表实例代码
2019/05/09 Python
python实现图片压缩代码实例
2019/08/12 Python
python爬虫之爬取百度音乐的实现方法
2019/08/24 Python
python 通过手机号识别出对应的微信性别(实例代码)
2019/12/22 Python
keras 特征图可视化实例(中间层)
2020/01/24 Python
Python读取Excel一列并计算所有对象出现次数的方法
2020/09/04 Python
python3中数组逆序输出方法
2020/12/01 Python
WEB控件及HTML服务端控件能否调用客户端方法?如果能,请解释如何调用?
2015/08/25 面试题
优秀应届毕业生自荐信
2013/11/16 职场文书
棉花姑娘教学反思
2014/02/15 职场文书
2014年为民办实事工作总结
2014/12/20 职场文书
个人培训总结
2015/03/05 职场文书
2015年九一八事变纪念活动实施方案
2015/05/06 职场文书
工作总结之小学教师体育工作范文(3篇)
2019/10/07 职场文书
linux下导入、导出mysql数据库命令的实现方法
2021/05/26 MySQL