我有一个 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应该是第二个等等...
预先感谢您的回复! :)
最佳答案
这是对字符字段的常见误解。由于 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)
但同样,这会给你带来一些可能错误的排序。请参阅下面我的评论。
关于MySQL 数据库固定 (?) 查询顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16152587/