mysql union 子句排序问题
有这样一个需求,在一个列表数据查询中,需要将数据分成两部分,每一部分的排序规则不一样,一个倒叙,一个正序。我想到的第一种方式便是使用两个查询语句,提供两个查询接口,客户端手动将两个查询结果进行拼接。
想想还是挺复杂的。于是便和同事商量一下看有无更得体的实现方式。经过一番讨论,对方不负所望,提出union语法,自此我心中大喜,敬佩之情便油然而生。实乃自己是sql渣渣,谜一般的逻辑和语法写起来就像绕进迷宫。所以在一般情况下能用Java处理的就优先不选择sql,这次也是,但如果考虑到用Java实现太复杂的话我会直接请教别人。请教完以后自己也懒得归纳总结,仍然继续选择当一个sql渣渣。所以我最害怕在面试的时候考sql题。但这次我要做好记录。
一开始是这样的:
因为每个子查询的排序规则不一样,所以:
然后提示:
于是在网上搜索,发现可以这么写:
写完后确实不报错了,但是排序没有生效
兜兜转转,打开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。我笑了,没想到反转来的这么快,就隔着一个换行符。
所以最后的代码如下:
这里还有一个不得不考虑的问题,那就是limit多少条合适?
如果想要实现子句排序,那么limit的范围就是全部数据。 幸运的是我们的业务所涉及到的行数并不多,因为在where条件中有时间范围限制。
版权声明: 本文为 InfoQ 作者【LSJ】的原创文章。
原文链接:【http://xie.infoq.cn/article/39649d0714e92404c47174d0a】。文章转载请联系作者。
评论