这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战
特殊的mysql排序操作
前文
本文仅为一次特殊的MySQL排序记录,解决方案并非最佳方案,作为一次使用的笔记留存。
问题描述
本问题主要是由于遇到了一个特殊字段的排序操作问题。首先来看数据库的数据:
现在的需求是对于str字段进行排序,但需要对于str字段的一部分进行排序。也就是先对第6位数字进行排序,再对第九位数字进行排序。
解决思路分析
通过对于题目的分析可以得知,通过简单的order by操作应该是无法直接排序得到结果。直接对str进行order by操作排序的内容是str字段的ascII码,与题目的要求明显不符。此时,我们要引入今天的重头戏,在order by中应用substr。先来看使用的sql语句:
select * from orderInfo ORDER BY SUBSTR(str,5,6),SUBSTR(str,10,11)
如上所示可以轻易看出,通过对于substr函数的应用,可以对str字段的一部分截取作为排序的变量。而根据order by本身的性质可以得出,我们可以对与order by的结果再次进行order by操作。显然,这比通过对于结果的代码重新排序效率要高的多,下面来看排序结果:
如结果所以,与我们的要求完全符合。
内容扩展
除此之外,对于order by进行一下探索又发现了另一个函数,INSTR,用法同样的与substr类似,不过该函数的返回值则是只有0和1。因此,倘若在某些特殊情况下,如果我们需要对于某些类型的字段增加权重,使其直接排在最前或最后,即可使用如上函数。下面来看结果:
再看一下执行的sql语句:
select * from orderInfo ORDER BY INSTR(str,'t4') desc,SUBSTR(str,5,6),SUBSTR(str,10,11)
很明显,首先我们将t4开头的字段排序在最前,然后再根据题目所需的6,9位数字进行下一次排序即可。
很明显order by的操作还有很多类似的情况,还需要通过学习掌握。
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。