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 26 MySQL
Mysql文件存储图文详解
Jun 01 MySQL
MySQL 发生同步延迟时Seconds_Behind_Master还为0的原因
Jun 21 MySQL
MySQL的安装与配置详细教程
Jun 26 MySQL
mysql事务对效率的影响分析总结
Oct 24 MySQL
MySQL之MyISAM存储引擎的非聚簇索引详解
Mar 03 MySQL
关于k8s环境部署mysql主从的问题
Mar 13 MySQL
详解Mysq MVCC多版本的并发控制
Apr 29 MySQL
MySQL详细讲解变量variables的用法
Jun 21 MySQL
浅谈MySql update会锁定哪些范围的数据
Jun 25 MySQL
MySQL 原理与优化之Limit 查询优化
Aug 14 MySQL
Mysql的Table doesn't exist问题及解决
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二维数组的去重问题解析
2011/07/17 PHP
初识Laravel
2014/10/30 PHP
php连接odbc数据源并保存与查询数据的方法
2014/12/24 PHP
PHP可变变量学习小结
2015/11/29 PHP
PHP简单留言本功能实现代码
2017/06/09 PHP
PHP中的自动加载操作实现方法详解
2019/08/06 PHP
thinkphp5实现微信扫码支付
2019/12/23 PHP
javascript判断单选框或复选框是否选中方法集锦
2007/04/04 Javascript
JQuery 操作select标签实现代码
2010/05/14 Javascript
javascript利用初始化数据装配模版的实现代码
2010/11/17 Javascript
js内存泄露的几种情况详细探讨
2013/05/31 Javascript
浅析js封装和作用域
2013/07/09 Javascript
在js文件中如何获取basePath处理js路径问题
2013/07/10 Javascript
JavaScript编程中容易出BUG的几点小知识
2015/01/31 Javascript
在JavaScript中正确引用bind方法的应用
2015/05/11 Javascript
js正则匹配出所有图片及图片地址src的方法
2015/06/08 Javascript
laravel5.4+vue+element简单搭建的示例代码
2017/08/29 Javascript
对于js垃圾回收机制的理解
2017/09/14 Javascript
Angular 向组件传递模板的两种方法
2018/02/23 Javascript
D3.js 实现带伸缩时间轴拓扑图的示例代码
2020/01/20 Javascript
JavaScript点击按钮生成4位随机验证码
2021/01/28 Javascript
详解Python验证码识别
2016/01/25 Python
使用Python的urllib2模块处理url和图片的技巧两则
2016/02/18 Python
Python Requests模拟登录实现图书馆座位自动预约
2018/04/27 Python
Python3删除排序数组中重复项的方法分析
2019/01/31 Python
python字典改变value值方法总结
2019/06/21 Python
Numpy 中的矩阵求逆实例
2019/08/26 Python
PYTHON如何读取和写入EXCEL里面的数据
2019/10/28 Python
英国最大的手表网站:The Watch Hut
2017/03/31 全球购物
国际知名军事风格休闲装品牌:Alpha Industries(阿尔法工业)
2017/05/24 全球购物
公司JAVA开发面试题
2015/04/02 面试题
学校清明节活动总结
2014/07/04 职场文书
领导批评与自我批评范文
2014/10/16 职场文书
新教师教学工作总结
2015/08/14 职场文书
2016年度师德标兵先进事迹材料
2016/02/26 职场文书
python pyhs2 的安装操作
2021/04/07 Python