【问题标题】:MySQL Natural Sort (like OSX Finder)MySQL 自然排序(如 OSX Finder)
【发布时间】:2013-03-21 12:39:13
【问题描述】:

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

让我解释一下:我有一个包含数千种产品的表格,每个产品都有一个字母数字 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 中使用它,所以我不知道它是否有效并且实际上是我的问题的答案。

【问题讨论】:

    标签: mysql natural-sort


    【解决方案1】:

    你在获取数据时使用 PHP 吗?

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

    【讨论】:

    • 哦,天哪,这太简单了,但我花了几十天时间,natsort() 从来没有想过。非常感谢!
    【解决方案2】:

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

    以下示例 ORDER BY 使用 COLLATE 处理 UTF8 数据:

    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 |
    +------+
    

    【讨论】:

    • 这实际上并不能满足我的需要:a2 应该在 a1 之后,a13c 应该在 a12 之后,但无论如何谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-09-06
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多