MySQL自然排序(如OSX Finder)

时间:2013-03-21 12:39:14

标签: mysql natural-sort

我已经搜索了很长时间了,但我找到的解决方案并没有按照我的需要进行操作。

让我解释一下:我有一个包含数千种产品的表,每种产品都带有一个字母数字SKU,也可用于分类。 该SKU包括:

Category Code(可变数量的字母字符),

Product Number(整数),

Product Model Variation(可选,可变数量的字母字符)

例如:MANT 12 CL(不含空格)


现在,我需要像这样订购它们(如果这些是文件名,OSX Finder会完美地订购它们):

MANT1
MANT2
MANT2C
MANT2D
MANT2W
MANT3
MANT4C
MANT9
MANT12
MANT12C
MANT12CL
MANT12P
MANT13
MANT21
MANT24
MANT24D
MANT29

当然ORDER BY sku显然是错误的:

MANT1
MANT12
MANT12C
MANT12CL
MANT12P
MANT13
MANT2
MANT21
MANT24
MANT24D
MANT29
MANT2C
MANT2D
MANT2W
MANT3
MANT4C
MANT9

ORDER BY LENGTH(sku), sku在排序模型变体时遇到问题:

MANT1
MANT2
MANT3
MANT9
MANT12
MANT13
MANT21
MANT24
MANT29
MANT2C
MANT2D
MANT2W
MANT4C
MANT12C
MANT12P
MANT24D
MANT12CL

那么,有没有办法像Finder那样对这些东西进行排序?

(另外,一旦排序,有没有办法获得下一个和以前的产品?我不介意使用几个查询:此时优雅是我的最后一个问题...)

提前感谢大家。


最后一件事:我在搜索过程中发现this answer to a similar question 但我不知道如何在PHP中使用它,所以我不知道它是否有效,实际上是我的问题的答案。

2 个答案:

答案 0 :(得分:1)

您在获取数据时是否使用PHP?

如果是这样,请在数据加载后尝试使用natural sort function进行内存排序吗?

答案 1 :(得分:0)

订单不是“完全错误”,它只取决于您使用的排序规则。在您的情况下,您可以尝试二进制排序规则,例如'latin1_bin'。

以下示例使用COLLATE对UTF8数据进行ORDER BY:

mysql> SELECT c1 FROM t1 ORDER BY c1;
+------+
| c1   |
+------+
| a1   |
| a12  |
| a13c |
| a2   |
| a21  |
+------+

mysql> SELECT c1 FROM t1 ORDER BY c1 COLLATE 'utf8_bin';
+------+
| c1   |
+------+
| a1   |
| a12  |
| a2   |
| a21  |
| a13c |
+------+