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查询语句的执行过程
May 07 MySQL
MySQL 逻辑备份与恢复测试的相关总结
May 14 MySQL
为什么MySQL分页用limit会越来越慢
Jul 25 MySQL
SQL实现LeetCode(177.第N高薪水)
Aug 04 MySQL
MySQL修改默认引擎和字符集详情
Sep 25 MySQL
浅谈mysql哪些情况会导致索引失效
Nov 20 MySQL
SQL注入篇学习之盲注/宽字节注入
Mar 03 MySQL
一条慢SQL语句引发的改造之路
Mar 16 MySQL
mysql insert 存在即不插入语法说明
Mar 25 MySQL
MySQL时区造成时差问题
Apr 13 MySQL
mysql函数之截取字符串的实现
Aug 14 MySQL
postgresql如何找到表中重复数据的行并删除
May 08 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
Linux下实现PHP多进程的方法分享
2012/08/16 PHP
php实现仿写CodeIgniter的购物车类
2015/07/29 PHP
抛弃 PHP 代价太高
2016/04/26 PHP
今天你说520了吗?不仅有php表白书还有java表白神器
2016/05/20 PHP
PHP中spl_autoload_register()函数用法实例详解
2016/07/18 PHP
PHP使用数组实现矩阵数学运算的方法示例
2017/05/29 PHP
php中关于换行的实例写法
2019/09/26 PHP
jQuery的一些注意
2006/12/06 Javascript
jQuery 页面载入进度条实现代码
2009/02/08 Javascript
js 编写规范
2010/03/03 Javascript
javascript 系统文件夹文件操作及参数介绍
2013/01/08 Javascript
js中widow.open()方法使用详解
2013/07/30 Javascript
JS拖拽组件学习使用
2016/01/19 Javascript
javascript 的变量、作用域和内存问题
2017/04/19 Javascript
ES6 javascript的异步操作实例详解
2017/10/30 Javascript
AjaxUpLoad.js实现文件上传
2018/03/05 Javascript
vue中利用simplemde实现markdown编辑器(增加图片上传功能)
2019/04/29 Javascript
微信小程序实现Session功能及无法获取session问题的解决方法
2019/05/07 Javascript
Vue的Options用法说明
2020/08/14 Javascript
python实现猜数字游戏(无重复数字)示例分享
2014/03/29 Python
centos系统升级python 2.7.3
2014/07/03 Python
利用python代码写的12306订票代码
2015/12/20 Python
python如何重载模块实例解析
2018/01/25 Python
Python中XlsxWriter模块简介与用法分析
2018/04/24 Python
windows上彻底删除jupyter notebook的实现
2020/04/13 Python
基于Python爬取fofa网页端数据过程解析
2020/07/13 Python
PyCharm中关于安装第三方包的三个建议
2020/09/17 Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
2020/11/28 Python
HTML5拖放API实现拖放排序的实例代码
2017/05/11 HTML / CSS
HTML里显示pdf、word、xls、ppt的方法示例
2020/04/14 HTML / CSS
Jones New York官网:美国女装品牌,受白领女性欢迎
2019/11/26 全球购物
20岁生日感言
2014/01/13 职场文书
投标诚信承诺书
2014/05/26 职场文书
本科毕业生求职信
2014/06/15 职场文书
行政工作试用期自我评价
2014/09/14 职场文书
党政领导班子群众路线对照检查材料
2014/10/26 职场文书