【需求分析】

系统接入ERP,订单会根据商品的发货仓进行拆单,所以订单之间不再是单独的关系,而有了子单母单的概念。在做最小的改动的情况下,数据库的改造是在订单表上增加了parent_order_sn字段,所谓的母订单号。如果订单A被拆单,则A应该是母订单,订单状态是‘已拆单’。通过parent_order_sn=‘A订单号’去查询,可以查到对应的子订单记录。

【问题再现】

之前我一直在负责和ERP系统对接的项目,所以对原系统的订单查询改造是另一个同事写的。最近和ERP的对接做了一些修改,可能母订单A拆除的子订单B和子订单C会再一次进行拆分,即订单B可以是一个母订单,B下面有其他两个子订单D和子订单E。在进行这一轮修改的测试,订单列表查询偶尔出现了错位的情况,如下:

正确的展示,如下:

但这种错误现象也不是百分百存在,之前都没有发现有问题。看别人的代码, 真的是不想做的一件事,特别是这种复杂问题的代码,上线前一天看了下,觉得代码写的太复杂了,找不到问题,还是不动了。而就在昨天上线的上午,出现频率比较高,就乖乖又去看代码了,按照代码实现逻辑理了一遍,发现其实思路就是不对的,分页查询一直是有问题的,也没有人注意到。

【代码重写】

原来的代码实现思路是:将所有的母单排除,查询出所有的子单,并加上分页一页10条。然后循环结果集,从子单上获取相关订单信息组装到母单上。

而这样的结果,就不对了。如果在10条记录中,有子母单的订单,查询到的结果数就一直是不确定的。最简单的设想,前10条都是子母单的订单,那么其实只会展示5个订单,而每页的订单数量是根据子母单数量的多少而改变的,显然是不对的。

既然找到问题了,而且代码实现完全不对,就直接选择换思路重写代码,不改也逃不过了。

现在的代码实现思路是:将所有的母单查询到,查询完母单后,再去循环,判断如果有子单的情况下,去查询订单下所有的子单,组装到母订单上。这样不管有多少子母单的情况,有子单算一单,没有子单也算一单,也不用关心这个母单是不是由一个子单继续拆分的,也保证了分页的数量是正确的。

【实现难题】

既然思路确定了,接下来就是写代码了。但是问题来了,我不知道怎么样把所有的母单查询到,而且是不重复的所有母单。下面是数据库中订单的截图:

总结一下,其实就是两种情况:

  1. parent_order_sn那一列可能是没有值的,也就是算是一个母订单;
  2. 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倒叙排序。

【心得总结】

  1. 代码实现前,思路是很重要的,思路是对的,才能保证结果是对的。

同事做之前就和她讨论过该怎么实现,可是结果还是按照她自己的想法去做的,之前没有发现问题,我也就没有去看她是怎么实现的。看完后,才发现思路是不对的,结果就不一定能保证对了。

  1. 代码重写,双方都不是滋味。

出问题的代码,不是自己写的,一万个不想去看别人写的代码。出问题的代码,是自己写的,结果不对,于是被别人推翻重写,一万个怀疑我写的代码怎么可能不对。讲真,这应该是这行业最真实的心理写照。

  1. 代码是需要积累的,项目经验是宝贵的。

在工作中,每一个需求,每一次代码实现,都是我们积累的财富。代码写的多了,项目中遇到的情况多了,总是会有价值的。

  1. 不要总想着逃避,其实没有那么困难。

时间长了,心态不太好了,总想着问题和我无关,少做一点,让自己轻松一点。出问题了,就觉得牵扯的东西太多了,不想去碰,等到不得不解决的那一刻才去做,而不是主动去处理问题。换一个心态,或许结果还是美好的。

SQL Union实现子母单列表展示相关推荐

  1. 案例:用户信息列表展示

    一.需求设计分析 1.需求:用户信息的增删改查操作      2.设计:            1.技术选型:Servlet+JSP+MySQL+JDBCTemplate+Duird+BeanUtil ...

  2. [android] 手机卫士黑名单功能(列表展示)

    先把要拦截的电话号码保存到数据库中,拦截模式用个字段区分,1 电话拦截,2 短信拦截,3全部拦截 新建Activity类CallSmsSafeActivity.java 新建布局文件activity_ ...

  3. 微信朋友圈,QQ空间,微博等列表展示的功能实现

    内容摘要 该控件能够应用于内容资讯展示的功能模块中,如:腾讯和新浪微博的微博列表,微信朋友圈及其它社交类应用的好友动态展示列表等:实现了类似腾讯微博的微博列表展示功能,包含微博文本内容,表情,图片,话 ...

  4. 案例:用户信息列表展示||1. 需求 2. 设计 3. 开发4. 测试 5. 部署运维

    案例:用户信息列表展示 1. 需求:用户信息的增删改查操作 2. 设计: 1. 技术选型:Servlet+JSP+MySQL+JDBCTemplate+Druid+BeanUtils+tomcat   ...

  5. mess组网 中继_取代中继/子母路由 堪称最上乘的Mesh组网方式了解下

    试问,谁不想要一个畅快.无死角的无线网络,为此你都试过哪些行而有效的解决办法?换服务商,换网线,装AP,加无线中继,子母路由等等...虽然这些措施能在一定程度上改善身边的无线网络质量,但却都不是我们今 ...

  6. SQL进阶,子查询与窗口函数

    本节给大家讲解SQL在实际过程中用途比较多的子查询与窗口函数,下面一起学习. 示例工具:MySQL8.0.Navicat Premium 12 本文讲解内容:子查询与窗口函数 适用范围:SQL进阶应用 ...

  7. 【升级包】jeecg_online 支持主子表列表展示风格模板升级包,简易升级

    [升级包]Online新模板支持主子表列表展示风格 功能说明: 一对多模型的数据,可以在列表方式展示子表数据信息,支持多子表. 发布日期:  2017-12-11 版本兼容:  3.7.1 以上版本 ...

  8. (转)淘淘商城系列——MyBatis分页插件(PageHelper)的使用以及商品列表展示

    http://blog.csdn.net/yerenyuan_pku/article/details/72774381 上文我们实现了展示后台页面的功能,而本文我们实现的主要功能是展示商品列表,大家要 ...

  9. apex图表使用饼图居中_还在用单饼图展示Excel数据?一分钟学会制作复合饼图

    导读:今天要讲的Excel小技巧,关于Excel的复合饼图,饼图是用来快速展示百分比的一个优良工具,单一饼图大部分小伙伴都能够制作出来,其实在Excel中还有另外一种饼图--复合饼图,是饼图的升级版, ...

最新文章

  1. 【译】①JWS之Java[tm] Web Start开发者指南目录
  2. elasticsearch查询
  3. 活动目录的设计及部署方法
  4. DevExpress控件之GridControl、GridView
  5. eclipse导入github项目提示没有发现项目_eclipse clone克隆github远程库工程到本地
  6. wxWidgets:wxHeaderColumnSimple类用法
  7. orcale实现自定义优先级排序的SQL
  8. python异步io 队列_python 学习笔记九 队列,异步IO
  9. 用c#编写爬虫在marinetraffic下载船仅仅图片
  10. 面向对象的相关面试题
  11. matlab解决无约束优化问题
  12. VVOL和VASA Provider
  13. 若依将ehcache改为redis缓存详细整合步骤
  14. nw.js桌面软件开发系列 第0.1节 HTML5和桌面软件开发的碰撞
  15. Protel99SE应用技术问答(经典)
  16. J2EE是什么(二)
  17. 广州图书馆跳转中国知网教程
  18. 苹果通用链接跳转apple-app-site-association
  19. 77. Combinations
  20. Node.js 种子下载器

热门文章

  1. 绿色毕业论文答辩PPT模板
  2. html定位之制作花样链接卡,花样玩转超链接 PPT超链设置方法
  3. 44. TA镜像加载时的验证
  4. 第六届蓝桥杯真题总结
  5. Indent tool and KR code style
  6. 国外整理的一套在线渗透测试资源合集
  7. windows电脑之间如何快速迁移软件和环境?
  8. python打不出双引号的解决办法
  9. 会计会php,恩格会计软件(PHP+MySQL)
  10. 计算机考试为什么试题不能复制,3月ACCA考试开场——ACCA机考复制粘贴究竟可不可以?...