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 中相关的锁
May 25 MySQL
52条SQL语句教你性能优化
May 25 MySQL
正确使用MySQL INSERT INTO语句
May 26 MySQL
浅谈MySQL user权限表
Jun 18 MySQL
MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用详解
Jun 26 MySQL
SQL实现LeetCode(175.联合两表)
Aug 04 MySQL
MySQL中CURRENT_TIMESTAMP的使用方式
Nov 27 MySQL
mysql中整数数据类型tinyint详解
Dec 06 MySQL
Mysql事务索引知识汇总
Mar 17 MySQL
MySQL RC事务隔离的实现
Mar 31 MySQL
MySQL普通表如何转换成分区表
May 30 MySQL
mysql sql常用语句大全
Jun 21 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产生动态的影像图
2006/10/09 PHP
tp5实现微信小程序多图片上传到服务器功能
2018/07/16 PHP
在Javascript中为String对象添加trim,ltrim,rtrim方法
2006/09/22 Javascript
JSONP获取Twitter和Facebook文章数的具体步骤
2014/02/24 Javascript
javascript常用的正则表达式实例
2014/05/15 Javascript
Javascript核心读书有感之词法结构
2015/02/01 Javascript
详解JavaScript的策略模式编程
2015/06/24 Javascript
jQuery学习笔记之回调函数
2016/08/15 Javascript
angularjs定时任务的设置与清除示例
2017/06/02 Javascript
安装vue-cli报错 -4058 的解决方法
2017/10/19 Javascript
JavaScript设计模式之命令模式实例分析
2019/01/16 Javascript
JS代码检查工具ESLint介绍与使用方法
2020/02/04 Javascript
精读《Vue3.0 Function API》
2020/05/20 Javascript
使用Vue-scroller页面input框不能触发滑动的问题及解决方法
2020/08/08 Javascript
vscode 调试 node.js的方法步骤
2020/09/15 Javascript
pyramid配置session的方法教程
2013/11/27 Python
利用Psyco提升Python运行速度
2014/12/24 Python
在Python3中初学者应会的一些基本的提升效率的小技巧
2015/03/31 Python
Python中的urllib模块使用详解
2015/07/07 Python
Python Paramiko模块的安装与使用详解
2016/11/18 Python
解决Python字典写入文件出行首行有空格的问题
2017/09/27 Python
win10系统下Anaconda3安装配置方法图文教程
2018/09/19 Python
python实现生成字符串大小写字母和数字的各种组合
2019/01/01 Python
Pandas分组与排序的实现
2019/07/23 Python
将python依赖包打包成window下可执行文件bat方式
2019/12/26 Python
HTML5之HTML元素扩展(下)—增强的Form表单元素值得关注
2013/01/31 HTML / CSS
解析HTML5的存储功能和web SQL的相关操作方法
2016/02/19 HTML / CSS
一家专门做特卖的网站:唯品会
2016/10/09 全球购物
初一学生评语大全
2014/04/24 职场文书
义和团口号
2014/06/17 职场文书
建设幸福中国演讲稿
2014/09/11 职场文书
认错检讨书
2014/10/02 职场文书
端午节活动总结报告
2015/02/11 职场文书
JavaScript中关于预编译、作用域链和闭包的理解
2021/03/31 Javascript
opencv读取视频并保存图像的方法
2021/06/04 Python
SQL中的三种去重方法小结
2021/11/01 SQL Server