环境准备数据库版本:MySQL5.7.20-logCreatetableSQLDROPTABLEIFEXISTS`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'Productself-code',`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_sixtydouble(16,4)DEFAULTNULLCOMMENT'去年同期60天销量',same_period_sale_qty_ninety',same_period_sale_qty_ninety(1`,FA`)NULLCOMMENT'去年同期90天销售额',`create_user`bigint(20)DEFAULTNULLCOMMENT'creator',`create_time`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMPCOMMENT'创建时间',`modify_user`bigint(20)默认NULLCOMMENT'最后修改人',`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='商品销售统计';初始化数据准备就绪769063项目数据需求背景商业组织销售商品。同一个商业机构可以销售不同的商品,同一种商品可以在不同的商业机构销售。也就是说:商业组织和商品是多对多的关系。假设现在有n个机构,每个机构有几个产品,如何查询各个产品在这些门店的销售情况?具体类似于查询100001下1000、1001、1003、100002产品,100003下1006、1008、1009产品的销售情况。查询;业务组织清单和产品清单不是固定的,而是动态的。那么问题来了:如何查询多个商业组织下某商品的销售情况。我描述之后,可能会比较模糊。意思大家都明白了那就好!很容易想到循环查询。在代码层面,业务组织列表是循环的,每个业务组织查一次数据库。伪代码如下:具体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中引入的比较规范行并不是一个新特性,而是一个长期存在的基本功能!参考《SQL进阶教程》MagicSQL:MySQLExecutionPlan→EXPLAIN,让我们了解SQL的执行过程!神奇SQL的性能优化→让SQL飞起来神奇SQL擦肩而过→索引真的用上了吗?
