SQL Union实现子母单列表展示
【需求分析】
系统接入ERP,订单会根据商品的发货仓进行拆单,所以订单之间不再是单独的关系,而有了子单母单的概念。在做最小的改动的情况下,数据库的改造是在订单表上增加了parent_order_sn字段,所谓的母订单号。如果订单A被拆单,则A应该是母订单,订单状态是‘已拆单’。通过parent_order_sn=‘A订单号’去查询,可以查到对应的子订单记录。
【问题再现】
之前我一直在负责和ERP系统对接的项目,所以对原系统的订单查询改造是另一个同事写的。最近和ERP的对接做了一些修改,可能母订单A拆除的子订单B和子订单C会再一次进行拆分,即订单B可以是一个母订单,B下面有其他两个子订单D和子订单E。在进行这一轮修改的测试,订单列表查询偶尔出现了错位的情况,如下:
正确的展示,如下:
但这种错误现象也不是百分百存在,之前都没有发现有问题。看别人的代码, 真的是不想做的一件事,特别是这种复杂问题的代码,上线前一天看了下,觉得代码写的太复杂了,找不到问题,还是不动了。而就在昨天上线的上午,出现频率比较高,就乖乖又去看代码了,按照代码实现逻辑理了一遍,发现其实思路就是不对的,分页查询一直是有问题的,也没有人注意到。
【代码重写】
原来的代码实现思路是:将所有的母单排除,查询出所有的子单,并加上分页一页10条。然后循环结果集,从子单上获取相关订单信息组装到母单上。
而这样的结果,就不对了。如果在10条记录中,有子母单的订单,查询到的结果数就一直是不确定的。最简单的设想,前10条都是子母单的订单,那么其实只会展示5个订单,而每页的订单数量是根据子母单数量的多少而改变的,显然是不对的。
既然找到问题了,而且代码实现完全不对,就直接选择换思路重写代码,不改也逃不过了。
现在的代码实现思路是:将所有的母单查询到,查询完母单后,再去循环,判断如果有子单的情况下,去查询订单下所有的子单,组装到母订单上。这样不管有多少子母单的情况,有子单算一单,没有子单也算一单,也不用关心这个母单是不是由一个子单继续拆分的,也保证了分页的数量是正确的。
【实现难题】
既然思路确定了,接下来就是写代码了。但是问题来了,我不知道怎么样把所有的母单查询到,而且是不重复的所有母单。下面是数据库中订单的截图:
总结一下,其实就是两种情况:
- parent_order_sn那一列可能是没有值的,也就是算是一个母订单;
- parent_order_sn有值的情况下,一定是会有多条的。
我怎么保证一个sql能查询到没有问题的分页结果,parent_order_sn有值的情况下,需要Distinct,没有值的情况下,需要查出所有,脑子里开始想SQL怎么写,GROUP BY,DISTINCT,IF,CASE…WHEN…各种SQL函数,还是不知道这个SQL该怎么写了。
中午吃完饭就开始想,到两点要开始工作了,和前端说了句,这一个SQL没法写,写不出来,我只能查出正确的结果之后,再自己去做分页分组的处理。说完,我就想到了既然一个SQL不能实现,我就用两个SQL去查,然后合并结果集。三两分钟,不重复的母单的SQL查询就写出来了。如下:
SELECT*
FROM(SELECTt.*, cus.customer_titleFROMwms_orders tLEFT JOIN wms_customer cus ON cus.id = t.buyer_idWHEREt.order_status != 100AND t.comp_id = 8815AND t.parent_order_sn IS NOT NULLAND t.parent_order_sn != ''GROUP BYparent_order_snORDER BYt.id_ DESC) a
UNIONSELECT*FROM(SELECTt.*, cus.customer_titleFROMwms_orders tLEFT JOIN wms_customer cus ON cus.id = t.buyer_idWHEREt.order_status != 100AND t.comp_id = 8815AND (t.parent_order_sn IS NULLOR t.parent_order_sn = '')ORDER BYt.id_ DESC) bORDER BYid_ DESC
其实很简单,就是两种分开写,用union将两个SQL合并,查询不重复的结果集。
第一个SQL对应parent_order_sn有值的情况下,用Group By按parent_order_sn字段分组,并且,将第二种情况parent_order_sn没有值的排除。
第二个SQL对应parent_order_sn没有值的情况,并且将第一种情况parent_order_sn有值的排除。
最后用union,并且按id倒叙排序。
【心得总结】
- 代码实现前,思路是很重要的,思路是对的,才能保证结果是对的。
同事做之前就和她讨论过该怎么实现,可是结果还是按照她自己的想法去做的,之前没有发现问题,我也就没有去看她是怎么实现的。看完后,才发现思路是不对的,结果就不一定能保证对了。
- 代码重写,双方都不是滋味。
出问题的代码,不是自己写的,一万个不想去看别人写的代码。出问题的代码,是自己写的,结果不对,于是被别人推翻重写,一万个怀疑我写的代码怎么可能不对。讲真,这应该是这行业最真实的心理写照。
- 代码是需要积累的,项目经验是宝贵的。
在工作中,每一个需求,每一次代码实现,都是我们积累的财富。代码写的多了,项目中遇到的情况多了,总是会有价值的。
- 不要总想着逃避,其实没有那么困难。
时间长了,心态不太好了,总想着问题和我无关,少做一点,让自己轻松一点。出问题了,就觉得牵扯的东西太多了,不想去碰,等到不得不解决的那一刻才去做,而不是主动去处理问题。换一个心态,或许结果还是美好的。
SQL Union实现子母单列表展示相关推荐
- 案例:用户信息列表展示
一.需求设计分析 1.需求:用户信息的增删改查操作 2.设计: 1.技术选型:Servlet+JSP+MySQL+JDBCTemplate+Duird+BeanUtil ...
- [android] 手机卫士黑名单功能(列表展示)
先把要拦截的电话号码保存到数据库中,拦截模式用个字段区分,1 电话拦截,2 短信拦截,3全部拦截 新建Activity类CallSmsSafeActivity.java 新建布局文件activity_ ...
- 微信朋友圈,QQ空间,微博等列表展示的功能实现
内容摘要 该控件能够应用于内容资讯展示的功能模块中,如:腾讯和新浪微博的微博列表,微信朋友圈及其它社交类应用的好友动态展示列表等:实现了类似腾讯微博的微博列表展示功能,包含微博文本内容,表情,图片,话 ...
- 案例:用户信息列表展示||1. 需求 2. 设计 3. 开发4. 测试 5. 部署运维
案例:用户信息列表展示 1. 需求:用户信息的增删改查操作 2. 设计: 1. 技术选型:Servlet+JSP+MySQL+JDBCTemplate+Druid+BeanUtils+tomcat ...
- mess组网 中继_取代中继/子母路由 堪称最上乘的Mesh组网方式了解下
试问,谁不想要一个畅快.无死角的无线网络,为此你都试过哪些行而有效的解决办法?换服务商,换网线,装AP,加无线中继,子母路由等等...虽然这些措施能在一定程度上改善身边的无线网络质量,但却都不是我们今 ...
- SQL进阶,子查询与窗口函数
本节给大家讲解SQL在实际过程中用途比较多的子查询与窗口函数,下面一起学习. 示例工具:MySQL8.0.Navicat Premium 12 本文讲解内容:子查询与窗口函数 适用范围:SQL进阶应用 ...
- 【升级包】jeecg_online 支持主子表列表展示风格模板升级包,简易升级
[升级包]Online新模板支持主子表列表展示风格 功能说明: 一对多模型的数据,可以在列表方式展示子表数据信息,支持多子表. 发布日期: 2017-12-11 版本兼容: 3.7.1 以上版本 ...
- (转)淘淘商城系列——MyBatis分页插件(PageHelper)的使用以及商品列表展示
http://blog.csdn.net/yerenyuan_pku/article/details/72774381 上文我们实现了展示后台页面的功能,而本文我们实现的主要功能是展示商品列表,大家要 ...
- apex图表使用饼图居中_还在用单饼图展示Excel数据?一分钟学会制作复合饼图
导读:今天要讲的Excel小技巧,关于Excel的复合饼图,饼图是用来快速展示百分比的一个优良工具,单一饼图大部分小伙伴都能够制作出来,其实在Excel中还有另外一种饼图--复合饼图,是饼图的升级版, ...
最新文章
- 【译】①JWS之Java[tm] Web Start开发者指南目录
- elasticsearch查询
- 活动目录的设计及部署方法
- DevExpress控件之GridControl、GridView
- eclipse导入github项目提示没有发现项目_eclipse clone克隆github远程库工程到本地
- wxWidgets:wxHeaderColumnSimple类用法
- orcale实现自定义优先级排序的SQL
- python异步io 队列_python 学习笔记九 队列,异步IO
- 用c#编写爬虫在marinetraffic下载船仅仅图片
- 面向对象的相关面试题
- matlab解决无约束优化问题
- VVOL和VASA Provider
- 若依将ehcache改为redis缓存详细整合步骤
- nw.js桌面软件开发系列 第0.1节 HTML5和桌面软件开发的碰撞
- Protel99SE应用技术问答(经典)
- J2EE是什么(二)
- 广州图书馆跳转中国知网教程
- 苹果通用链接跳转apple-app-site-association
- 77. Combinations
- Node.js 种子下载器