MySQL 数据库固定 (?) 查询顺序

标签 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应该是第二个等等...

预先感谢您的回复! :)

最佳答案

这是对字符字段的常见误解。由于 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/

相关文章:

php - 查询未完全显示

mysql - 容器无法连接到 MySql DB

mysql - SQL 查询 - NOW() 上的联合

mysql - 如何以更好的方式重写这个嵌套查询?

c# - 如何按两个属性对这个简单的 .NET 列表进行排序?

php - 如何使用 PHP 从 MySQL 中选择最后 3 分钟的记录

mysql - mySql的select语句

sql-server - SQL 服务器 : select distinct by one column and by another column value

mysql - 如何在sql中对行进行分组排序

sql - 在 ORDER BY 子句中转换列别名