查询MySQL时使用自然排序

时间:2017-09-10 09:05:29

标签: mysql sorting

我在表格中找到了一些看起来像这样的数据。

+------+
| code |
+------+
| Z1   |
| Z2   |
| Z3   |
| Z4   |
| Z10  |
| Z11  |
| Z12  |
| Z13  |
| Z20  |
| ZA   |
| ZBN  |
| ZFJK |
| ZX   |
+------+

运行SELECT code FROM codes会返回:

+------+
| code |
+------+
|   Z1 |
|  Z10 |
|  Z11 |
|  Z12 |
|  Z13 |
|   Z2 |
|  Z20 |
|   Z3 |
|   Z4 |
|   ZA |
|  ZBN |
| ZFJK |
|   ZX |
+------+

我喜欢做的是通过类似Z1的内容获取3个第一个代码Z2Z3SELECT code FROM codes WHERE code >= 'Z1' LIMIT 3。然而,这个声明会返回,考虑到MySQL如何对数据进行排序,这是预期的。

+------+
| code |
+------+
|   Z1 |
|  Z10 |
|  Z11 |
+------+

获得3个第一个代码后,我想在3个第一个代码后得到3个代码。类似于此SELECT code FROM codes WHERE code > 'Z3' LIMIT 3,然后获取Z4Z10Z11。之后接下来的3个项Z12Z13Z20等等。

如果我查询了所有项目,我能够获得输出naturally的输出但是我只想要有3个项目,跟随基于natural排序返回的3个项目。我可以在MySQL中实现这一点,还是只需获取所有数据并操作查询数据库的程序中的数据?

SQLFiddle - > here

3 个答案:

答案 0 :(得分:1)

您可以按顺序使用lpad

--download-archive

答案 1 :(得分:0)

您遇到的问题是您希望(据我理解)首先按字母顺序对数据进行排序,然后按数字部分对数据进行排序,以便获得的顺序为:

+------+
| code |
+------+
| Z1   |
| Z2   |
| Z3   |
| Z4   |
| Z10  |
| Z11  |
| Z12  |
| Z13  |
| Z20  |
| ZA   |
| ZBN  |
| ZFJK |
| ZX   |
+------+

但是,您不能直接在SQL中执行此操作,因为它会将整个字符串排序为一个信息单元。

所以你需要将字符串分成两部分,但字母部分的长度是可变的,两者之间没有分隔符。

第一个解决方案是在代码中添加一个分隔符(如果可以的话),以便它们如下所示:

+-------+
| code  |
+-------+
| Z-1   |
| Z-2   |
| Z-3   |
| Z-4   |
| Z-10  |
| Z-11  |
| Z-12  |
| Z-13  |
| Z-20  |
| ZA    |
| ZBN   |
| ZFJK  |
| ZX    |
+-------+

这将允许您通过查找分隔符的位置将字符串拆分为两个字符串并单独对它们进行排序。

如果你不能放入分隔符(因为这已经定义了),那么你需要在SQL中编写一个函数来分割这两个字符串。

答案 2 :(得分:0)

如果您知道Z只有一个字符:

WHERE     0+MID(code, 2) > 1
ORDER BY  0+MID(code, 2)

如果alpha前缀是可变长度的,那么代码变得太乱了,不能在SQL"中执行。 MariaDB会更容易一些,它有REGEXP_REPLACE()

之类的东西