MySQL数据库修复(?)查询排序

时间:2013-04-22 16:58:52

标签: mysql sql-order-by

我有一个具有不同图片名称的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 应该是第二,等等...

预先感谢您的回复! :)

1 个答案:

答案 0 :(得分: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)

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