我在表格中找到了一些看起来像这样的数据。
+------+
| 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个第一个代码Z2
,Z3
和SELECT 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
,然后获取Z4
,Z10
和Z11
。之后接下来的3个项Z12
,Z13
和Z20
等等。
如果我查询了所有项目,我能够获得输出naturally
的输出但是我只想要有3个项目,跟随基于natural
排序返回的3个项目。我可以在MySQL中实现这一点,还是只需获取所有数据并操作查询数据库的程序中的数据?
SQLFiddle - > here
答案 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()
。