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 相关文章推荐
Idea连接MySQL数据库出现中文乱码的问题
Apr 14 MySQL
MySQL root密码的重置方法
Apr 21 MySQL
52条SQL语句教你性能优化
May 25 MySQL
浅析MySQL如何实现事务隔离
Jun 26 MySQL
MySQL系列之开篇 MySQL关系型数据库基础概念
Jul 02 MySQL
MySQL系列之七 MySQL存储引擎
Jul 02 MySQL
QT连接MYSQL数据库的详细步骤
Jul 07 MySQL
SQL实现LeetCode(175.联合两表)
Aug 04 MySQL
Mysql binlog日志文件过大的解决
Oct 05 MySQL
MySQL库表太大怎么办? 数据库分库分表项目实践
Apr 11 MySQL
MySQL 执行数据库更新update操作的时候数据库卡死了
May 02 MySQL
讲解MySQL增删改操作
May 06 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 采集获取指定网址的内容
2010/01/05 PHP
非常精妙的PHP递归调用与静态变量使用
2012/12/16 PHP
PHP实现扎金花游戏之大小比赛的方法
2015/03/10 PHP
[原创]PHP字符串中插入子字符串方法总结
2016/05/06 PHP
jQuery 瀑布流 绝对定位布局(二)(延迟AJAX加载图片)
2012/05/23 Javascript
Js四则运算函数代码
2012/07/21 Javascript
浅谈checkbox的一些操作(实战经验)
2013/11/20 Javascript
jQuery判断数组是否包含了指定的元素
2015/03/10 Javascript
JQuery用户名校验的具体实现
2016/03/18 Javascript
JavaScript实现设计模式中的单例模式的一些技巧总结
2016/05/17 Javascript
js检查是否关闭浏览器的方法
2016/08/02 Javascript
使用Require.js封装原生js轮播图的实现代码
2017/06/15 Javascript
jQuery响应滚动条事件功能示例
2017/10/14 jQuery
jQuery.validate.js表单验证插件的使用代码详解
2018/10/22 jQuery
15分钟深入了解JS继承分类、原理与用法
2019/01/19 Javascript
vue组件定义,全局、局部组件,配合模板及动态组件功能示例
2019/03/19 Javascript
Vue实现日历小插件
2019/06/26 Javascript
Vue-axios-post数据后端接不到问题解决
2020/01/09 Javascript
JavaScript中layim之整合右键菜单的示例代码
2021/02/06 Javascript
Python二分查找详解
2015/09/13 Python
Python中datetime模块参考手册
2017/01/13 Python
基于Python os模块常用命令介绍
2017/11/03 Python
简述Python2与Python3的不同点
2018/01/21 Python
Python使用matplotlib实现基础绘图功能示例
2018/07/03 Python
Python实现将数据写入netCDF4中的方法示例
2018/08/30 Python
如何使用Python脚本实现文件拷贝
2019/11/20 Python
Python编程快速上手——疯狂填词程序实现方法分析
2020/02/29 Python
Python参数传递实现过程及原理详解
2020/05/14 Python
pytorch读取图像数据转成opencv格式实例
2020/06/02 Python
Python带参数的装饰器运行原理解析
2020/06/09 Python
Bulk Powders意大利:运动补充在线商店
2019/02/09 全球购物
工程师岗位职责规定
2014/02/26 职场文书
离婚协议书该怎么写
2014/10/04 职场文书
公司车队管理制度
2015/08/04 职场文书
安全事故隐患排查治理制度
2015/08/05 职场文书
导游词之镜泊湖
2019/12/09 职场文书