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 Threads_running飙升与慢查询的相关问题解决
May 08 MySQL
mysql5.7使用binlog 恢复数据的方法
Jun 03 MySQL
SQL实现LeetCode(177.第N高薪水)
Aug 04 MySQL
Mysql案例刨析事务隔离级别
Sep 25 MySQL
MySQL8.0升级的踩坑历险记
Nov 01 MySQL
SQL优化老出错,那是你没弄明白MySQL解释计划用法
Nov 27 MySQL
解决Mysql多行子查询的使用及空值问题
Jan 22 MySQL
一文简单了解MySQL前缀索引
Apr 03 MySQL
MySQL 执行数据库更新update操作的时候数据库卡死了
May 02 MySQL
MySQL 数据库 增删查改、克隆、外键 等操作
May 11 MySQL
mysql 排序失效
May 20 MySQL
MySQL生成千万测试数据以及遇到的问题
Aug 05 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 日期时间函数的高级应用技巧
2009/10/10 PHP
php生成RSS订阅的方法
2015/02/13 PHP
Laravel中注册Facades的步骤详解
2016/03/16 PHP
PHP中addslashes与mysql_escape_string的区别分析
2016/04/25 PHP
如何判断php mysqli扩展类是否开启
2016/12/24 PHP
yii插入数据库防并发的简单代码
2017/05/27 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
PHP绕过open_basedir限制操作文件的方法
2018/06/10 PHP
JQuery选择器特辑 详细小结
2012/05/14 Javascript
JavaScript返回网页中超链接数量的方法
2015/04/03 Javascript
JS创建事件的三种方法(实例代码)
2016/05/12 Javascript
微信小程序实战之仿android fragment可滑动底部导航栏(4)
2020/04/16 Javascript
jquery ui 实现 tab标签功能示例【测试可用】
2019/07/25 jQuery
对Python正则匹配IP、Url、Mail的方法详解
2018/12/25 Python
基于python的ini配置文件操作工具类
2019/04/24 Python
pytorch中tensor.expand()和tensor.expand_as()函数详解
2019/12/27 Python
TensorFlow实现自定义Op方式
2020/02/04 Python
python 批量下载bilibili视频的gui程序
2020/11/20 Python
基于HTML5的WebSocket的实例代码
2018/08/15 HTML / CSS
Agoda西班牙:全球特价酒店预订
2017/06/03 全球购物
新西兰廉价汽车租赁:Snap Rentals
2018/09/14 全球购物
Rodd & Gunn澳大利亚官网:新西兰男装品牌
2018/09/25 全球购物
精选鞋类、服装和配饰的全球领先目的地:Bodega
2021/02/27 全球购物
杭州-DOTNET笔试题集
2013/09/25 面试题
提高EJB性能都有哪些技巧
2012/03/25 面试题
运动会演讲稿
2014/05/07 职场文书
环卫工人先进事迹材料
2014/06/02 职场文书
放飞理想演讲稿
2014/09/09 职场文书
学习作风建设心得体会
2014/10/22 职场文书
有限公司股东合作协议书
2014/10/29 职场文书
党员思想汇报材料
2014/12/19 职场文书
世界地球日活动总结
2015/02/09 职场文书
开会通知
2015/04/20 职场文书
大国崛起英国观后感
2015/06/02 职场文书
Python绘画好看的星空图
2022/03/17 Python
Spring Boot 使用 Spring-Retry 进行重试框架
2022/04/24 Java/Android