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 07 MySQL
my.ini优化mysql数据库性能的十个参数(推荐)
May 26 MySQL
mysql获取指定时间段中所有日期或月份的语句(不设存储过程,不加表)
Jun 18 MySQL
MySQL分库分表详情
Sep 25 MySQL
mysql中整数数据类型tinyint详解
Dec 06 MySQL
mysql自增长id用完了该怎么办
Feb 12 MySQL
MySQL 开窗函数
Feb 15 MySQL
解决MySQL添加新用户-ERROR 1045 (28000)的问题
Mar 03 MySQL
Linux系统下MySQL配置主从分离的步骤
Mar 21 MySQL
pt-archiver 主键自增
Apr 26 MySQL
MySQL安装失败的原因及解决步骤
Jun 14 MySQL
关于MySQL中explain工具的使用
May 08 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获取汉字首字母的函数
2013/11/07 PHP
PHP函数shuffle()取数组若干个随机元素的方法分析
2016/04/02 PHP
对PHP依赖注入的理解实例分析
2016/10/09 PHP
php封装的page分页类完整实例
2016/10/18 PHP
php和redis实现秒杀活动的流程
2019/07/17 PHP
Laravel框架实现文件上传的方法分析
2019/09/29 PHP
jquery api参考 visualjquery 中国线路 速度快
2007/11/30 Javascript
JQuery 1.3.2以上版本中出现pareseerror错误的解决方法
2011/01/11 Javascript
js加强的经典分页实例
2013/03/15 Javascript
JavaScript实现GriwView单列全选(自写代码)
2013/05/13 Javascript
jQuery实现多级下拉菜单jDropMenu的方法
2015/08/28 Javascript
jQuery实现宽屏图片轮播实例教程
2015/11/24 Javascript
JS实现仿UC浏览器前进后退效果的实例代码
2017/07/17 Javascript
Bootstrap图片轮播效果详解
2017/10/17 Javascript
nodejs基于mssql模块连接sqlserver数据库的简单封装操作示例
2018/01/05 NodeJs
element el-input directive数字进行控制
2018/10/11 Javascript
element-ui的回调函数Events的用法详解
2018/10/16 Javascript
vuex + keep-alive实现tab标签页面缓存功能
2019/10/17 Javascript
实例讲解React 组件
2020/07/07 Javascript
谈谈JavaScript中的函数
2020/09/08 Javascript
跟老齐学Python之Python文档
2014/10/10 Python
python搭建微信公众平台
2016/02/09 Python
一些Centos Python 生产环境的部署命令(推荐)
2018/05/07 Python
详解python3中zipfile模块用法
2018/06/18 Python
Python partial函数原理及用法解析
2019/12/11 Python
利用CSS3制作简单的3d半透明立方体图片展示
2017/03/25 HTML / CSS
Sephora丝芙兰泰国官方网站:国际知名化妆品购物
2017/11/15 全球购物
EJB3推出JPA的原因
2013/10/16 面试题
传播学毕业生求职信
2013/10/11 职场文书
数控专业大学毕业生职业规划范文
2014/02/06 职场文书
毕业生学校推荐信范文
2014/05/21 职场文书
领导干部廉政自律承诺书
2014/05/26 职场文书
共青团员自我评价
2015/03/10 职场文书
Python机器学习之PCA降维算法详解
2021/05/19 Python
只用40行Python代码就能写出pdf转word小工具
2021/05/31 Python
Winsows11性能如何? win11性能测评多核竟比Win10差了10%
2021/11/21 数码科技