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 如何查询时间段交集
Jun 08 MySQL
MySQL中utf8mb4排序规则示例
Aug 02 MySQL
MySQL连接控制插件介绍
Sep 25 MySQL
Mysql数据库表中为什么有索引却没有提高查询速度
Feb 24 MySQL
将MySQL的表数据全量导入clichhouse库中
Mar 21 MySQL
Mysql分析设计表主键为何不用uuid
Mar 31 MySQL
mysql的Buffer Pool存储及原理
Apr 02 MySQL
MySQL分区以及建索引的方法总结
Apr 13 MySQL
WINDOWS下安装mysql 8.x 的方法图文教程
Apr 19 MySQL
mysql使用FIND_IN_SET和group_concat两个方法查询上下级机构
Apr 20 MySQL
MySQL的prepare使用以及遇到的bug
May 11 MySQL
MySQL中dd::columns表结构转table过程及应用详解
Sep 23 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/12/30 PHP
php输出xml属性的方法
2015/03/19 PHP
php生成网页桌面快捷方式
2017/05/05 PHP
javascript高亮效果的二种实现方法
2008/09/14 Javascript
Javascript中Eval函数的使用
2010/03/23 Javascript
基于Jquery制作的幻灯片图集效果打包下载
2011/02/12 Javascript
js 获取radio按钮值的实例
2013/08/17 Javascript
JS批量操作CSS属性详细解析
2013/12/16 Javascript
Node.js中使用事件发射器模式实现事件绑定详解
2014/08/15 Javascript
轻松实现js选项卡切换效果
2016/09/24 Javascript
详解使用fetch发送post请求时的参数处理
2017/04/05 Javascript
微信小程序页面滑动屏幕加载数据效果
2020/11/16 Javascript
JS实现的input选择图片本地预览功能示例
2018/08/29 Javascript
webpack@v4升级踩坑(小结)
2018/10/08 Javascript
Vue从TodoList中学父子组件通信
2019/02/05 Javascript
微信小程序开发之左右分栏效果的实例代码
2019/05/20 Javascript
vue动态路由:路由参数改变,视图不更新问题的解决
2019/11/05 Javascript
Python多线程编程(一):threading模块综述
2015/04/05 Python
python中numpy基础学习及进行数组和矢量计算
2017/02/12 Python
TensorFlow损失函数专题详解
2018/04/26 Python
Python定义二叉树及4种遍历方法实例详解
2018/07/05 Python
深入了解Django中间件及其方法
2019/07/26 Python
Python 3 判断2个字典相同
2019/08/06 Python
python 类之间的参数传递方式
2019/12/20 Python
详解pandas获取Dataframe元素值的几种方法
2020/06/14 Python
keras K.function获取某层的输出操作
2020/06/29 Python
python基于opencv实现人脸识别
2021/01/04 Python
大女孩胸罩:Big Girls Bras
2016/12/15 全球购物
大学毕业生通用自我评价
2014/01/05 职场文书
《我要的是葫芦》教学反思
2014/02/23 职场文书
安全承诺书格式
2014/05/21 职场文书
小学生美德少年事迹材料
2014/08/24 职场文书
环境卫生倡议书
2014/08/29 职场文书
学校教师师德师风承诺书
2015/04/28 职场文书
解决ObjectMapper.convertValue() 遇到的一些问题
2021/06/30 Java/Android
Vue提供的三种调试方式你知道吗
2022/01/18 Vue.js