MySQL连表查询分组去重的实现示例

 更新时间:2021年07月01日 11:20:14   作者:kylin冰麒麟  
本文将结合实例代码,介绍MySQL连表查询分组去重,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧

业务逻辑

通过多种渠道将小程序的活动页链接发布出去,比如通过多多种短信附带链接( 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中获取最大值MAX()函数和ORDER BY … LIMIT 1比较

    MySQL中获取最大值MAX()函数和ORDER BY … LIMIT 1比较

    mysql取最大值的的是max 和order by两种方式,同时也大多数人人为max的效率更高,在本文中,我们将介绍MySQL中MAX()和ORDER BY … LIMIT 1两种获取最大值的方法以及它们性能上的差异,同时我们将探讨这种性能差异的原因,并提供一些优化建议
    2024-03-03
  • 使用pt-kill根据一定的规则来kill连接的方法

    使用pt-kill根据一定的规则来kill连接的方法

    pt-kill 是一个优秀的kill MySQL连接的一个工具,是percona toolkit的一部分,在因为空闲连接较多导致超过最大连接数、某个有问题的sql导致mysql负载很高时,都需要将一些连接kill掉,这个工具主要就是这个用途
    2016-04-04
  • 如何实现MySQL的索引

    如何实现MySQL的索引

    这篇文章主要介绍了如何实现MySQL的索引,MySQL中索引分三类,有B+树索引、Hash索引和全文索引,下面我们一起来看看MySQL索引的具体实现,需要的小伙伴可以参考一下
    2022-01-01
  • Mysql5.7.11绿色版安装教程图文详解

    Mysql5.7.11绿色版安装教程图文详解

    本文通过图文并茂的形式给大家展示Mysql5.7.11绿色版安装教程,非常不错,具有参考借鉴价值,需要的朋友参考下
    2017-01-01
  • 提高MySQL深分页查询效率的三种方案

    提高MySQL深分页查询效率的三种方案

    这篇文章介绍了提高MySQL深分页查询效率的三种方案,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • MySQL实现两张表数据的同步

    MySQL实现两张表数据的同步

    本文将介绍mysql 触发器实现两个表的数据同步,需要学习MySQL的童鞋可以参考。
    2016-10-10
  • 日常收集整理常见的mysql sql技巧

    日常收集整理常见的mysql sql技巧

    本篇内容是小编日常收集整理常见的mysql sql技巧,对大家学习mysql sql技巧相关内容有所帮助,感兴趣的朋友一起学习吧
    2015-12-12
  • 安装Mysql5.7.10 winx64出现的几个问题汇总

    安装Mysql5.7.10 winx64出现的几个问题汇总

    这篇文章主要介绍了安装Mysql5.7.10 winx64出现的几个问题汇总及解决方案,非常不错,需要的朋友可以参考下
    2016-08-08
  • 使用SQL实现小计,合计以及排序

    使用SQL实现小计,合计以及排序

    本篇文章是对SQL实现小计,合计以及排序进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • 解决mysql报错You must reset your password using ALTER USER statement before executing this statement问题

    解决mysql报错You must reset your password&nb

    文章介绍了在Linux系统中解决MySQL 5.7及以上版本root用户密码过期无法登录的问题方法,以及如何处理系统权限表mysql.user结构错误的问题
    2024-11-11

最新评论