MySQL分组后拿到所有数据_mysql分组后获取若干数据

2023-05-16

最近做一个链表分组查询,并且取每个分组的前几位数据的业务

例如有商品表,订单表,品类表,商品表中有自己的分类,并且商品表外键关联品类表主键,订单表外键关联商品表中的商品id

业务需要,根据当前时间区间进行年月周日,进行时间对比,也就是说分组第一优先为时间,其次为商品分类,再到品类,再到商品中的社群属性,一共分组条件为4组

列出关键字段

商品表字段goods_id,goods_type,main_category_id,applicable_crowd,son_category_id等

订单表字段order_id,create_date,order_price等

品类表字段id,category_name等

第一解决方案,直接根据上面所有条件进行分组然后在代码层面对数据进行二次筛选,适合小数据量,直接上sql代码

SELECT

DATE_FORMAT(o.create_date,'%Y-%m-%d') AS create_date,

o.order_id           AS order_id,

COUNT(*)             AS order_total,

g.goods_type         AS goods_type,

g.main_category_id   AS category_id,

b.category_name      AS category_name,

SUM(o.order_price)   AS order_price,

g.applicable_crowd   AS applicable_crowd,

g.son_category_id

FROM `order` o

JOIN goods_base g

ON o.goods_id = g.goods_id

LEFT JOIN articlecategories b

ON g.main_category_id = b.id

WHERE o.is_delete = 0

AND g.is_delete = 0

AND DATE_FORMAT(o.create_date, '%Y-%m-%d') >= DATE_FORMAT('2018-05-01', '%Y-%m-%d')

AND DATE_FORMAT(o.create_date, '%Y-%m-%d') <= DATE_FORMAT('2018-05-01', '%Y-%m-%d')

GROUP BY create_date, g.goods_type,g.son_category_id,g.applicable_crowd

ORDER BY create_date,order_price DESC;

上面的结果集中DATE_FORMAT(o.create_date,'%Y-%m-%d') AS create_date,可以根据条件换成周,月,年

DATE_FORMAT(o.create_date,'%Y-%u') AS create_date周

DATE_FORMAT(o.create_date,'%Y-%m') AS create_date月

DATE_FORMAT(o.create_date,'%Y') AS create_date年

注意:这个时候,分组的条件一定是create_date而不是o.create_date,因为我们是对结果集的create_date进行分组,而不是对原有数据集的o.create_date分组,这个非常重要,同样排序的时候,我们也是对结果集的create_date和结果集中的order_price进行分组的

这种获取到的结果是按时间分组后拿出该时间段所有的数据,需要在业务层代码对其进行一定的分析后或者有用数据

ed218f9470a6ad9aeed5287f336d7284.png

第二种解决方案,需要mysql的虚拟自增id,我们对刚刚的数据集作为一张表,这张表和自己用时间段来进行自联查询获取他们的笛卡尔积,然后通建立一个虚拟自增seq,通过order_price和seq的对比来获取需要笛卡尔积中需要的数据集,本业务中是通过order_price倒序seq升序来排列的,那么条件为a.order_price<=b.order_price and a.seq>=b.seq这个逻辑可以理解成a表中的任意一条数据都能对应到b表中本身的数据和当前价格比他大但是序列号比他小,sql也是利用上面的sql进行自联查询,并赋予一个自增的seq

SELECT

a.create_date,

a.order_id,

a.order_total,

a.goods_type,

a.category_id,

a.category_name,

a.order_price,

a.applicable_crowd

FROM (

SELECT

kk.*,

(@j:=@j+1)    AS seq

FROM(

SELECT

DATE_FORMAT(o.create_date,'%Y-%m-%d') AS create_date,

o.order_id         AS order_id,

COUNT(*)           AS order_total,

g.goods_type       AS goods_type,

g.main_category_id AS category_id,

b.category_name    AS category_name,

SUM(o.order_price) AS order_price,

g.applicable_crowd AS applicable_crowd,

g.son_category_id

FROM `order` o JOIN goods_base g

ON o.goods_id=g.goods_id LEFT JOIN articlecategories b ON g.main_category_id=b.id

WHERE o.is_delete=0 AND g.is_delete=0

AND DATE_FORMAT(o.create_date, '%Y-%m-%d') >= DATE_FORMAT('2018-05-01', '%Y-%m-%d')

AND DATE_FORMAT(o.create_date, '%Y-%m-%d') <= DATE_FORMAT('2018-05-01', '%Y-%m-%d')

GROUP BY create_date,

g.goods_type,g.son_category_id,g.applicable_crowd  ORDER BY create_date,order_price DESC

) kk ,(SELECT @j:=0) it

) a

JOIN

(

SELECT

kk.*,

(@i:=@i+1)    AS seq

FROM(

SELECT

DATE_FORMAT(o.create_date,'%Y-%m-%d') AS create_date,

o.order_id         AS order_id,

COUNT(*)           AS order_total,

g.goods_type       AS goods_type,

g.main_category_id AS category_id,

b.category_name    AS category_name,

SUM(o.order_price) AS order_price,

g.applicable_crowd AS applicable_crowd,

g.son_category_id

FROM `order` o JOIN goods_base g

ON o.goods_id=g.goods_id LEFT JOIN articlecategories b ON g.main_category_id=b.id

WHERE o.is_delete=0 AND g.is_delete=0

AND DATE_FORMAT(o.create_date, '%Y-%m-%d') >= DATE_FORMAT('2018-05-01', '%Y-%m-%d')

AND DATE_FORMAT(o.create_date, '%Y-%m-%d') <= DATE_FORMAT('2018-05-01', '%Y-%m-%d')

GROUP BY create_date,

g.goods_type,g.son_category_id,g.applicable_crowd  ORDER BY create_date,order_price DESC

) kk ,(SELECT @i:=0) it

) b

ON a.create_date = b.create_date

AND a.order_price <= b.order_price

AND a.seq >= b.seq

GROUP BY a.create_date,a.goods_type,a.son_category_id,a.applicable_crowd,a.order_price

HAVING COUNT(a.order_price) <= 8

ORDER BY a.create_date,a.order_price DESC;

同样需要注意的是,在第一次分组中create_date和排序中create_date,order_price选择

这种方式是一条sql可以解决数据读取问题,并不会返回大量数据,但是在数据量稍微大一点的场景下,sql要反复对其筛选,会非常卡顿

第三种解决方案,利用代码层面和sql分开做

思路:首先根据业务层传过来的参数,进行判定是否需要拆成多个分组,将分组查询数据的条件准备好,利用CountDownLatch分成子线程来查询

c1ee4dbf1b7df14cd9f263a4b8de3bd9.png

7a40201ebb564d4c31af2f60c6182599.png

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL分组后拿到所有数据_mysql分组后获取若干数据 的相关文章

  • 【Spring Boot组件集成实战】集成Kaptcha谷歌验证码

    更多精彩内容 xff0c 请访问 Spring Boot组件集成实战专栏 xff01 推荐项目 xff1a 一套基于Spring Boot 43 Layui的内容管理系统 快速开发脚手架 xff08 含完整的开发文档 演示网址等 xff09
  • Redis

    NoSQL数据库 概述 NoSQL数据库 xff0c 指的是非关系型的数据库 不依赖业务逻辑的方式存储 xff0c 而是以简单的key value模式存储 因此大大增加了数据库的扩展能力 不遵循SQL标准不支持ACID 原子性 xff1a
  • 动态规划之戳气球

    leetcode312 戳气球 这一题可以用动态规划来解决 但是dp含义的设置和状态转移方程的设计很有意思 首先 一维dp难以实现的 xff0c 应该考虑二维dp xff0c 尤其在一个数组中 xff0c 要考虑到双指针移动来解决复杂问题
  • Java正则表达式

    捕获组 span class token keyword public span span class token keyword static span span class token keyword void span span cl
  • 进程同步与互斥

    什么是进程同步 答 xff1a 进程同步指的是 xff0c 由于进程并发执行具有异步性 xff08 即各自以独立地 不可预知的速度向前推进 xff09 xff0c 但是某些情况下又需要进程之间进行配合和协调来完成一项工作 xff08 存在执
  • maven项目clean,Some problems were encountered while building the effective model for

    maven项目点击clean出现问题 xff1a Some problems were encountered while building the effective model for com whgk robotclient jar
  • linux常用命令(五)解压缩、软件包安装

    解压缩 tar xff1a c xff1a 打包 t xff1a 显示内容目录 x xff1a 解压 z xff1a 使用zip gzip压缩 v xff1a 显示详细信息 f xff1a 指定文件 tar cf xx tar file x
  • 配置阿里云的CDN加速

    1 控制台中找到CDN的控制台 需要开通 xff0c 按流量 按带宽都可以 2 添加域名 在 39 域名管理中 39 39 添加域名 39 3 修改域名的DNS 添加域名管理后 xff0c 会产生一个cname值 xff0c 将原来域名的d
  • openssl升级时,libssl.so.10缺失问题

    openssl升级时 xff0c 造成了动态库的缺失 xff0c wget yum命令都不能正常使用 报错 xff1a error while loading shared libraries libcrypto so 1 0 0 cann
  • Python的类定义,实例化

    定义 xff1a 必须使用class关键字 类名必须是用大驼峰命名 类定义完成后 xff0c 就会产生一个类对象 xff0c 绑定到了标识符ClassName上 class ClassName 语句块 举例 xff1a class MyCl
  • iOS开发,引入第三方库,秒验,XCBBuildService崩溃,问题解决

    之前使用秒验SDK都是直接引入 xff0c 便可使用 xff0c 今天引入后 xff0c XCBBuildService意外退出 尝试各种方法都不可以 于是使用CocoaPods引入第三方库 xff0c 终于可以运行 xff0c 但是仍然报
  • 【Spring Boot组件集成实战】集成MyBatis-Plus-Generator代码生成器(Version 3.5.1+)

    更多精彩内容 xff0c 请访问 Spring Boot组件集成实战专栏 xff01 推荐项目 xff1a 一套基于Spring Boot 43 Layui的内容管理系统 快速开发脚手架 xff08 含完整的开发文档 演示网址等 xff09
  • Ansible的安装与使用

    Ansible的安装 1 安装源 yum search ansible yum y install centos release ansible 29 2 安装ansible yum y install ansible 3 添加被管理服务器
  • 利用栈实现计算器功能-C语言

    功能 xff1a 实现计算器 xff0c 可以运算带括号的表达式 如1 43 xff08 1 43 1 xff09 2 43 1 首先 xff0c 我们需要了解中缀表达式和后缀表达式 中缀表达式 xff08 符号在中间 xff09 xff1
  • 【MAVEN】 IDEA maven基本配置及远程仓库发布、拉取依赖

    MAVEN IDEA maven配置三要素 xff08 本地安装并下载 xff09 MAVEN HOME 需要配置好MAVEN的本地环境变量 MAVEN settings xml 配置文件 镜像地址 mirros 本地仓库位置 localr
  • GO 语言离线安装包

    Go 安装包前提 所有包的安装下载都必须开启 go mod xff0c 并且 Go 版本需要大于 1 11 go env w GO111MODULE 61 on 包下载和安装需要在GOPATH 下一个项目内进行 准备好离线的包 在一台有网络
  • 为什么不建议你使用windows中的WSL

    什么是WSL Windows Subsystem for Linux xff0c WSL xff0c 也就是Windows Linux子系统 xff0c 可以在windows内使用linux 类似于一台Linux虚拟机了 xff0c 但是
  • gin获取json参数_Gin 学习之响应处理

    01 String c String 第一个参数是code 第二个参数是格式化字符串 第三个开始的若干参数支持任何数据类型 示例代码 输出结果 用户名 frank 02 JSON Gin 使用 nbsp encoding json nbsp
  • 判断门禁卡是否加密_离无卡生活更进一步!判断您的门禁卡能否被手机NFC功能模拟...

    第一步要判断门禁卡是否能够被模拟 先看看小米手机如何判断 如果是小米手机 xff0c 其中高端产品在MIUI9 5 稳定版以后 xff0c 在小米钱包里面增加了门卡模拟功能 如果在门卡模拟界面 xff0c 根本就识别不了门禁卡 xff0c
  • vue实现更换背景图片_vue.js怎么改背景图片,vue怎么设置背景图片

    vue js怎么改背景图片 怎么改变了背景图片 xff0c vue js改变背景图片的方法 xff1a 通过内嵌样式引入样式 xff0c 使用 require 方法 xff0c 代码为 div style 61 leftBg div 相关文

随机推荐