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 Router实现MySQL的读写分离的方法
May 27 MySQL
如何自己动手写SQL执行引擎
Jun 02 MySQL
MyBatis 动态SQL全面详解
Oct 05 MySQL
关于mysql中时间日期类型和字符串类型的选择
Nov 27 MySQL
全面盘点MySQL中的那些重要日志文件
Nov 27 MySQL
Golang连接并操作MySQL
Apr 14 MySQL
MySQL 语句执行顺序举例解析
Jun 05 MySQL
手把手带你彻底卸载MySQL数据库
Jun 14 MySQL
MySQL数据库之内置函数和自定义函数 function
Jun 16 MySQL
MySQL事务的隔离级别详情
Jul 15 MySQL
Mysql中mvcc各场景理解应用
Aug 05 MySQL
DQL数据查询语句使用示例
Dec 24 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实现文件下载断点续传详解
2014/10/15 PHP
php比较相似字符串的方法
2015/06/05 PHP
[全兼容哦]--实用、简洁、炫酷的页面转入效果loing
2007/05/07 Javascript
jQuery实现的类flash菜单效果代码
2010/05/17 Javascript
子窗口、父窗口和Silverlight之间的相互调用
2010/08/16 Javascript
JavaScript中的onerror事件概述及使用
2013/04/01 Javascript
javascript中html字符串转化为jquery dom对象的方法
2015/08/27 Javascript
通过javascript进行UTF-8编码的实现方法
2016/06/27 Javascript
jQuery 3.0十大新特性最终版发布
2016/07/14 Javascript
Angular外部使用js调用Angular控制器中的函数方法或变量用法示例
2016/08/05 Javascript
JavaScript 限制文本框不可输入英文单双引号的方法
2016/12/20 Javascript
BootStrap 弹出层代码
2017/02/09 Javascript
JS自定义滚动条效果简单实现代码
2020/10/27 Javascript
浅谈webpack打包生成的bundle.js文件过大的问题
2018/02/22 Javascript
vue 使用Jade模板写html,stylus写css的方法
2018/02/23 Javascript
Vue基于vuex、axios拦截器实现loading效果及axios的安装配置
2019/04/26 Javascript
vue-cli单页面预渲染seo-prerender-spa-plugin操作
2020/08/10 Javascript
Vue使用轮询定时发送请求代码
2020/08/10 Javascript
Vue实现购物小球抛物线的方法实例
2020/11/22 Vue.js
python实现根据用户输入从电影网站获取影片信息的方法
2015/04/07 Python
在Python的Django框架中编写错误提示页面
2015/07/22 Python
python技能之数据导出excel的实例代码
2017/08/11 Python
Python Datetime模块和Calendar模块用法实例分析
2019/04/15 Python
关于Python形参打包与解包小技巧分享
2019/08/24 Python
python使用if语句实现一个猜拳游戏详解
2019/08/27 Python
python 字符串常用函数详解
2019/09/11 Python
python查找特定名称文件并按序号、文件名分行打印输出的方法
2020/04/24 Python
python调用API接口实现登陆短信验证
2020/05/10 Python
Django返回HTML文件的实现方法
2020/09/17 Python
Notino瑞典:购买香水和美容产品
2019/07/26 全球购物
如何写一个Java类既可以用作applet也可以用作java应用
2016/01/18 面试题
小学生放飞梦想演讲稿
2014/08/26 职场文书
国庆节标语大全
2014/10/08 职场文书
先进党支部申报材料
2014/12/24 职场文书
幼儿园科学课教学反思
2016/03/03 职场文书
Redis特殊数据类型Geospatial地理空间
2022/06/01 Redis