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 infobright的安装步骤
Apr 07 MySQL
MySQL COUNT函数的使用与优化
May 10 MySQL
MYSQL数据库使用UTF-8中文编码乱码的解决办法
May 26 MySQL
mysq启动失败问题及场景分析
Jul 15 MySQL
MySQL子查询中order by不生效问题的解决方法
Aug 02 MySQL
详细聊聊关于Mysql联合查询的那些事儿
Oct 24 MySQL
浅谈mysql哪些情况会导致索引失效
Nov 20 MySQL
MySQL的存储函数与存储过程的区别解析
Apr 08 MySQL
mysql中如何用命令创建联合唯一索引
Apr 20 MySQL
mysql 索引的数据结构为什么要采用B+树
Apr 26 MySQL
Mysql 文件配置解析介绍
May 06 MySQL
MySQL数据库简介与基本操作
May 30 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操作SVN版本服务器类代码
2011/11/27 PHP
linux环境apache多端口配置虚拟主机的方法深入介绍
2013/06/09 PHP
php用正则表达式匹配URL的简单方法
2013/11/12 PHP
smarty模板引擎中内建函数if、elseif和else的使用方法
2015/01/22 PHP
php实现的美国50个州选择列表实例
2015/04/20 PHP
JS类定义原型方法的两种实现的区别评论很多
2007/09/12 Javascript
图片延迟加载的实现代码(模仿懒惰)
2013/03/29 Javascript
jquery实现metro效果示例代码
2013/09/06 Javascript
js去空格技巧分别去字符串前后、左右空格
2013/10/21 Javascript
php利用curl获取远程图片实现方法
2015/10/26 Javascript
15位和18位身份证JS校验的简单实例
2016/07/18 Javascript
jQuery简单实现彩色云标签效果示例
2016/08/01 Javascript
js前端解决跨域问题的8种方案(最新最全)
2016/11/18 Javascript
Web 开发中Ajax的Session 超时处理方法
2017/01/19 Javascript
js中创建对象的几种方式
2017/02/05 Javascript
Vue中div contenteditable 的光标定位方法
2018/08/25 Javascript
Vue实现Header渐隐渐现效果的实例代码
2020/11/05 Javascript
[02:07]DOTA2新英雄展现中国元素,完美“圣典”亮相央视
2016/12/19 DOTA
Python中音频处理库pydub的使用教程
2017/06/07 Python
Django使用httpresponse返回用户头像实例代码
2018/01/26 Python
浅析python3中的os.path.dirname(__file__)的使用
2018/08/30 Python
pandas通过loc生成新的列方法
2018/11/28 Python
在python中使用nohup命令说明
2020/04/16 Python
海信商城:海信电视、科龙空调、容声冰箱官方专卖
2017/02/07 全球购物
英国山地公路自行车商店:Tweeks Cycles
2018/03/16 全球购物
应届大学生自荐信格式
2013/09/21 职场文书
安全检查验收制度
2014/01/12 职场文书
财务会计自荐信范文
2014/02/21 职场文书
党员对照检查材料整改措施思想汇报
2014/09/26 职场文书
社区灵活就业证明
2014/11/03 职场文书
中班上学期个人总结
2015/02/12 职场文书
网吧员工管理制度
2015/08/05 职场文书
医护人员继续教育学习心得体会
2016/01/19 职场文书
电工生产实习心得体会
2016/01/22 职场文书
2017春节晚会开幕词
2016/03/03 职场文书
试用1103暨1103、1101同门大比武 [ DAIWEI ]
2022/04/05 无线电