2

我有一个带有不同图片名称的 MySQL 数据库,我想按名称订购。问题是我不知道我是否需要使用 PHP 或 MySQL 是否可以使用 :)

这是 MySQL 的排序方式,但这当然是错误的——因为-10.jpg-11.jpg应该在底部。

106-44XKJ7-1.jpg
106-44XKJ7-10.jpg
106-44XKJ7-11.jpg
106-44XKJ7-2.jpg
106-44XKJ7-3.jpg
106-44XKJ7-4.jpg
106-44XKJ7-5.jpg
106 -44XKJ7-6.jpg
106-44XKJ7-7.jpg
106-44XKJ7-8.jpg
106-44XKJ7-9.jpg

在表格中稍远一些,情况就是这样;

790_49BSBV_2.jpg
790_49BSBV_3.jpg
790_49BSBV_4.jpg
790_49BSBV.jpg

这看起来不错,但是,正如您可能已经猜到的那样,没有后续编号(下划线后面的数字)的应该是第一个,_2应该是第二个,依此类推......

提前感谢您的回复!:)

4

1 回答 1

2

这是对字符字段的常见误解。由于 10 和 11 实际上被视为您字段中的字符/文本(而不是数字),因此它们的排序确实正确,因为 10 比 1“大”并且比 2“小”。

如果您想按数字排序,您可以尝试从名称中解析数字,将它们转换为整数,然后按此排序。

MySQL中这样的东西可能会起作用:

ORDER BY SUBSTRING(name, 1, LOCATE('-', name, 5)), CAST(REPLACE(SUBSTRING(name, LOCATE('-', name, 5) + 1), '.jpg', '') as SIGNED)

这将从头开始解析字符并按它们排序。然后,它通过在名称中定位第二个破折号并删除它之前的所有内容来进行二次排序。然后它从该结果中删除 .jpg。它最终将它转换为一个整数,这样就可以对其进行正确排序。

或者,您可以简单地将另一个字段添加到您的表中(如 DateCreated 字段),然后排序更加直接。

更新的答案

ORDER BY 
    SUBSTRING(REPLACE(name, '_', '-'), 1, 5),
    CAST(REPLACE(SUBSTRING(REPLACE(name, '_', '-'), LOCATE('-', REPLACE(name, '_', '-'), 5) + 1), '.jpg', '') as SIGNED)

但同样,这会给你一些可能错误的排序。请参阅下面的评论。

于 2013-04-22T17:34:38.157 回答