mysql union 子句排序问题

用户头像
LSJ
关注
发布于: 2020 年 09 月 18 日

有这样一个需求,在一个列表数据查询中,需要将数据分成两部分,每一部分的排序规则不一样,一个倒叙,一个正序。我想到的第一种方式便是使用两个查询语句,提供两个查询接口,客户端手动将两个查询结果进行拼接。



想想还是挺复杂的。于是便和同事商量一下看有无更得体的实现方式。经过一番讨论,对方不负所望,提出union语法,自此我心中大喜,敬佩之情便油然而生。实乃自己是sql渣渣,谜一般的逻辑和语法写起来就像绕进迷宫。所以在一般情况下能用Java处理的就优先不选择sql,这次也是,但如果考虑到用Java实现太复杂的话我会直接请教别人。请教完以后自己也懒得归纳总结,仍然继续选择当一个sql渣渣。所以我最害怕在面试的时候考sql题。但这次我要做好记录。



一开始是这样的:



select t1.name from table_a where x = x
union
select t1.name from table_b where x = x



因为每个子查询的排序规则不一样,所以:



select t1.name from table_a where x = x order by t1.time desc
union
select t1.name from table_b where x = x order by t2.time asc



然后提示:



Incorrect usage of UNION and ORDER BY



于是在网上搜索,发现可以这么写:



(select t1.* FROM t_matches t1 where t1.status = '0' and t1.del_flag = '0' order by t1.begin_time desc)
UNION
(select t1.match_status, t1.match_id,t1.begin_time FROM t_matches t1 where t1.match_status = '2' and t1.del_flag = '0' ORDER BY t1.begin_time asc)



写完后确实不报错了,但是排序没有生效



兜兜转转,打开https://stackoverflow.com/questions/6732661/incorrect-usage-of-union-and-order-by这篇文章,看到一半,发现一句话



But note that applying order by to "substatement"s is meaningless because the docs have explicitly stated that order by is only guaranteed (cf.) to work when applied to the entire union statement:



意思就是在子句中使用order by毫无意义。像是发现了了不起的惊天大秘密一般,于是自己断章取义,将这一结果公布于同事。对方发出感慨“我之前还这么写过,现在怎么不行了呢”。对于他说的自己写过这一事实我深表怀疑。我把自己的sql语句发给他,他运行后也发现确实如此,然后总结到,那再想想其他办法吧。我陷入沉思中。



紧接着我又回到了文章中,想再寻找些蛛丝马迹。接着往下看,紧接着出现这句:



The only way order by would make sense in a "substatement" is if you combine it with limit



意思就是,如果想要子句的排序生效那就加上limit。我笑了,没想到反转来的这么快,就隔着一个换行符。



所以最后的代码如下:



(select t1.* FROM t_matches t1 where t1.status = '0' and t1.del_flag = '0' order by t1.begin_time desc limit 0,10)
UNION
(select t1.match_status, t1.match_id,t1.begin_time FROM t_matches t1 where t1.match_status = '2' and t1.del_flag = '0' ORDER BY t1.begin_time asc limit 0,10)



这里还有一个不得不考虑的问题,那就是limit多少条合适?



如果想要实现子句排序,那么limit的范围就是全部数据。 幸运的是我们的业务所涉及到的行数并不多,因为在where条件中有时间范围限制。



发布于: 2020 年 09 月 18 日 阅读数: 62
用户头像

LSJ

关注

微笑面对每一天 2018.11.11 加入

一个具有N年编程功力却早已拥有2N年工作经验的boy

评论

发布
暂无评论
mysql union子句排序问题