高逼格的 SQL 写法:行行比较
环境准备
数据库版本:MySQL 5.7.20-log。高逼格
图片
建表 SQL
复制DROP TABLE IF EXISTS `t_ware_sale_statistics`; CREATE TABLE `t_ware_sale_statistics` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键id,写行比 `business_id` bigint(20) NOT NULL COMMENT 业务机构编码, `ware_inside_code` bigint(20) NOT NULL COMMENT 商品自编码, `weight_sale_cnt_day` double(16,4) DEFAULT NULL COMMENT 平均日销量, `last_thirty_days_sales` double(16,4) DEFAULT NULL COMMENT 最近30天销量, `last_sixty_days_sales` double(16,4) DEFAULT NULL COMMENT 最近60天销量, `last_ninety_days_sales` double(16,4) DEFAULT NULL COMMENT 最近90天销量, `same_period_sale_qty_thirty` double(16,4) DEFAULT NULL COMMENT 去年同期30天销量, `same_period_sale_qty_sixty` double(16,4) DEFAULT NULL COMMENT 去年同期60天销量, `same_period_sale_qty_ninety` double(16,4) DEFAULT NULL COMMENT 去年同期90天销量, `create_user` bigint(20) DEFAULT NULL COMMENT 创建人, `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, `modify_user` bigint(20) DEFAULT NULL COMMENT 最终修改人, `modify_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 最终修改时间, `is_delete` tinyint(2) DEFAULT 2 COMMENT 是否删除,1:是法行,2:否,高逼格 PRIMARY KEY (`id`) USING BTREE, KEY `idx_business_ware` (`business_id`,`ware_inside_code`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT=商品销售统计;1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.初始化数据
准备了 769063 条数据。
图片
需求背景
业务机下销售商品,写行比同个业务机构可以销售不同的法行商品,同个商品可以在不同的高逼格业务机构销售,也就说:业务机构与商品是写行比多对多的关系。
假设现在有 n 个机构,法行每个机构下有几个商品,高逼格如何查询出这几个门店下各自商品的写行比销售情况?
具体点,类似如下:
图片
如何查出 100001 下商品 1000、法行1001、高逼格1003 、写行比 100002 下商品 1003、法行1004 、 100003 下商品 1006、1008、1009 的销售情况。
相当于是双层列表(业务机构列表中套商品列表)的查询;业务机构列表和商品列表都不是固定的,而是动态的站群服务器。
那么问题就是:如何查询多个业务机构下,某些商品的销售情况。
问题经我一描述,可能更模糊了,大家明白意思了就好!
循环查询
这个很容易想到,在代码层面循环业务机构列表,每个业务机构查一次数据库,伪代码如下:
图片
具体的 SQL 类似如下
图片
SQL 能走索引
图片
实现简单,也好理解,SQL 也能走索引,一切看起来似乎很完美。
然而现实是:部门开发规范约束,不能循环查数据库。
哦豁,这种方式只能放弃,另寻其他方式了。
OR 拼接
通过 MyBatis 的 动态 SQL 功能,进行 SQL 拼接,类似如下:
图片
具体的 SQL 类似如下:
图片
SQL 也能走索引。
图片
实现简单,也好理解,SQL 也能走索引,而且只查询一次数据库,貌似可行。
唯一可惜的亿华云计算是:有点费 OR,如果业务机构比较多,那 SQL 会比较长。
作为候选人之一吧,我们接着往下看。
混查过滤
同样是利用 Mybatis 的 动态 SQL ,将 business_id 列表拼在一起、 ware_inside_code 拼在一起,类似如下
图片
具体的 SQL 类似如下:
图片
SQL 也能走索引。
图片
实现简单,也好理解,SQL 也能走索引,而且只查询一次数据库,似乎可行。
但是:查出来的结果集大于等于我们想要的结果集,你品,你细品!
所以还需要对查出来的结果集进行一次过滤,过滤出我们想要的结果集。
姑且也作为候选人之一吧,我们继续往下看。
行行比较
SQL-92 中加入了行与行比较的功能,这样一来,源码下载比较谓词 = 、< 、> 和 IN 谓词的参数就不再只是标量值了,还可以是值列表了
当然,还是得用到 Mybatis 的 动态 SQL ,类似如下
图片
具体的 SQL 类似如下:
图片
SQL 同样能走索引。
图片
实现简单,SQL 也能走索引,而且只查询一次数据库,感觉可行。
只是:有点不好理解,因为我们平时这么用的少,所以这种写法看起来很陌生。
另外,行行比较是 SQL 规范,不是某个关系型数据库的规范,也就说关系型数据库都应该支持这种写法。
相关文章
电脑驱动重装教程(轻松学会电脑驱动重装,解决设备冲突和性能问题)
摘要:现如今,电脑已经成为人们生活和工作中必不可少的工具。但是,随着时间的推移,电脑的驱动程序可能会出现问题,导致设备冲突和性能下降。为了解决这些问题,我们需要学会如何重新安装电脑驱动。...2025-11-04
内存泄漏指程序未释放不再使用的内存,导致可用内存减少,常见于全局变量、事件监听未解绑、闭包和定时器等场景;现代语言通过垃圾回收机制管理内存,主要策略包括引用计数如Python,但无法处理循环引用)、标2025-11-04
首先创建单页模型,在PHPCMS后台【内容】→【单网页管理】中添加页面,填写标题、别名、内容并设置是否生成静态;接着可随时修改内容并重新生成HTML以更新前端显示;前台通过域名/index.php?m2025-11-04
解决 Chrome 旧版扩展停用问题:手把手教你重新启用 Manifest V2 扩展
之前一直在用的浏览器扩展突然无法使用,提示“此扩展程序不再受支持,因此已停用”。这是因为Chrome浏览器逐步推进Manifest V3标准,对旧版的Manifest V2扩展进行了限制2025-11-04电脑新手小白攻略教程(全面解析电脑使用技巧,帮助小白迅速掌握电脑操作)
摘要:作为现代人必不可少的工具,电脑的操作已经渗透到我们生活的方方面面。然而对于那些没有接触过电脑,或者只是使用电脑上网冲浪的小白来说,掌握电脑使用技巧可能显得有些困难。本文将从零基础开...2025-11-04- 复制shell>MySQL(和PHP搭配之最佳组合)--user=root MySQL(和PHP搭配之最佳组合)MySQL(和PHP搭配之最佳组合)2025-11-04
 

最新评论