本文链接:www.cnblogs.com/youzhibing/p/15101096.html环??境准备数据库版本:MySQL5.7.20-log建表SQL:DROPTABLEIFEXISTS`t_ware_sale_statistics`;CREATETABLE`t_ware_sale_statistics`(`id`bigint(20)NOTNULLAUTO_INCREMENTCOMMENT'主键id',`business_id`bigint(20)NOTNULLCOMMENT'企业组织代码',`ware_inside_code`bigint(20)NOTNULLCOMMENT'商品自编码',`weight_sale_cnt_day`double(16,4)DEFAULTNULLCOMMENT'平均日销售额',`last_thirty_days_sales`double(16,4)DEFAULTNULLCOMMENT'最近30天的销售额',`last_sixty_days_sales`double(16,4)DEFAULTNULLCOMMENT'过去60天的销售额',`last_ninety_days_sales`double(16,4)DEFAULTNULLCOMMENT'过去90天的销售额',`same_period_sale_qty_thirty`double(16,4)DEFAULTNULLCOMMENT'去年同期30天销售额',`same_period_sale_qty_sixty`double(16,4)DEFAULTNULLCOMMENT'去年同期60天销售额',`same_period_sale_qty_ninety`double(16,4)DEFAULTNULLCOMMENT'去年同期90天销售额',`create_user`bigint(20)DEFAULTNULLCOMMENT'Creator',`create_time`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMPCOMMENT'创建时间',`modify_user`bigint(20)DEFAULTNULLCOMMENT'最后修改人',`modify_time`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMPCOMMENT'最后修改时间',`is_delete`tinyint(2)DEFAULT'2'COMMENT'是否删除,1:是,2:否',PRIMARYKEY(`id`)USINGBTREE,KEY`idx_business_ware`(`business_id`,`ware_inside_code`)USINGBTREE)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4ROW_FORMAT=DYNAMICCOMMENT='商品销售统计';已为初始化数据准备了769,063项数据需求。商品在后台商业组织下销售。同一个商业机构可以销售不同的商品,同一个商品可以在不同的商业机构销售,也就是说:商业机构和商品之间是多对多的关系。假设有n个机构,每个机构下有多少商品。如何查看这些店铺下各自商品的销售情况?具体类似于查询100001下1000、1001、1003、100002产品,100003下1006、1008、1009产品的销售情况。查询;业务组织列表和产品列表不是固定的,而是动态的,所以问题是:如何查询多个业务组织下某个产品的销量(这个问题我描述之后可能比较模糊,大家明白意思就可以了!)很容易想到循环查询。在代码层面,业务组织列表是循环的,每个业务组织查一次数据库。伪代码如下:具体的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规范,不是关系型数据库的规范,也就是说所有的关系型数据库都应该支持这种写法。总结1、最后选择了线对线对比的方式,达到了要求。不要问我为什么,问就是了。格雷格!2.往往有很多种方法可以达到某个要求。我们需要结合业务和各种约束来选择最合适的。3.逐行比较是在1992年制定的SQL-92规范中引入的,逐行比较不是新特性,而是长期存在的基本功能!近期热点文章推荐:1.1000+Java面试题及答案(2022最新版)2.厉害了!Java协程来了。.3.SpringBoot2.x教程,太全面了!4、SpringBoot2.6正式发布,一大波新特性。.5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!
