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学习总结-基础架构概述
Apr 05 MySQL
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
Apr 05 MySQL
MySQL之DML语言
Apr 05 MySQL
mysql批量新增和存储的方法实例
Apr 07 MySQL
mysql的MVCC多版本并发控制的实现
Apr 14 MySQL
Mysql基础知识点汇总
May 26 MySQL
mysql定时自动备份数据库的方法步骤
Jul 07 MySQL
MySQL悲观锁与乐观锁的实现方案
Nov 02 MySQL
MySQL Innodb索引机制详细介绍
Nov 23 MySQL
MySQL高级进阶sql语句总结大全
Mar 16 MySQL
mysql的Buffer Pool存储及原理
Apr 02 MySQL
MYSQL事务的隔离级别与MVCC
May 25 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
DIY一个适配电脑声卡的动圈话筒放大器
2021/03/02 无线电
PHP 的 __FILE__ 常量
2007/01/15 PHP
php实现递归与无限分类的方法
2015/02/16 PHP
配置eAccelerator和XCache扩展来加速PHP程序的执行
2015/12/22 PHP
使用Codeigniter重写insert的方法(推荐)
2017/03/23 PHP
JavaScript中为元素加上name属性的方法
2011/05/09 Javascript
javascript string字符串优化问题
2011/07/31 Javascript
JS定时刷新页面及跳转页面的方法
2013/07/04 Javascript
Js 导出table内容到Excel的简单实例
2013/11/19 Javascript
浅谈JavaScript的Polymer框架中的behaviors对象
2015/07/29 Javascript
jQuery中事件与动画的总结分享
2016/05/24 Javascript
JavaScript遍历Json串浏览器输出的结果不统一问题
2016/11/03 Javascript
JS实现的自动打字效果示例
2017/03/10 Javascript
详解Vue.js 2.0 如何使用axios
2017/04/21 Javascript
angular5 httpclient的示例实战
2018/03/12 Javascript
NodeJS实现不可逆加密与密码密文保存的方法
2018/03/16 NodeJs
Moment.js实现多个同时倒计时
2019/08/26 Javascript
微信小程序实现按字母排列选择城市功能
2019/11/25 Javascript
Vue脚手架编写试卷页面功能
2020/03/17 Javascript
Vuex实现简单购物车
2021/01/10 Vue.js
解决python中os.listdir()函数读取文件夹下文件的乱序和排序问题
2018/10/17 Python
Gap工厂店:Gap Factory
2017/11/02 全球购物
澳大利亚相机之家:Camera House
2017/11/30 全球购物
美国正版电视节目和电影在线观看:Hulu
2018/05/24 全球购物
可打印的优惠券、杂货和优惠券代码:Coupons.com
2018/06/12 全球购物
英国书籍、CD、DVD和游戏的第一道德零售商:Awesome Books
2020/02/22 全球购物
优秀应届毕业生自荐信
2013/11/16 职场文书
个人自荐书
2013/12/20 职场文书
中专自我鉴定
2014/02/05 职场文书
售前工程师职业生涯规划
2014/03/02 职场文书
服装采购员岗位职责
2014/03/15 职场文书
企业精神口号
2014/06/11 职场文书
医院领导班子四风对照检查材料
2014/09/27 职场文书
2014年残联工作总结
2014/11/21 职场文书
mysql多表查询-笔记七
2021/04/05 MySQL
Go 语言下基于Redis分布式锁的实现方式
2021/06/28 Golang