【问题标题】:ORDER BY DESC is not working rightORDER BY DESC 无法正常工作
【发布时间】:2014-06-18 13:04:12
【问题描述】:

我有这个 sql 查询

SELECT `price` FROM `used_cars` ORDER BY `price` DESC 

所以我显然想按价格从高到低排序。但是,它似乎是取第一个数字并按此排序。我的理论是它把它当作一个字符串来对待,因为列是一个 varchar,所以它是有道理的。但是,这是第三方数据,所以我坚持使用它。我如何订购才能使较大的数字先到?

所以这是他们如何排序的一个例子

9698
8999
8988
8900
5983
4988
4984
42441
40949
3995
3995
38995
37685
36999
35983
34990
34785
32999
30594
29999
29999
2862
28000
27995

【问题讨论】:

  • 查看stackoverflow.com/questions/12126991/…了解如何转换为int
  • 这是应该是小数的文本列的预期行为。要更改它,首先备份您的数据库,然后运行以下命令:ALTER TABLE user_cars MODIFY COLUMN price DECIMAL(10,2);
  • @TimBurch 是对的 - 您需要更改数据的类型。您说这是第三方数据,但它显然在您的数据库中...您只是从第三方文件上传数据吗?没有什么能阻止您首先加载到临时文件,然后在到达最终目的地时进行转换。数值数据应存储在数值列中。

标签: mysql sql


【解决方案1】:

您应该将该列转换为数值数据类型。您可以在表定义或查询本身中执行此操作,例如:

... ORDER BY `price`+0 DESC

【讨论】:

  • 这是最好的答案。列的类型应改为十进制。
【解决方案2】:

CAST 应该可以工作:

SELECT CAST(price AS UNSIGNED) AS NumPrice
FROM used_cars
ORDER BY NumPrice DESC

【讨论】:

    【解决方案3】:

    这应该可行:

    (...)
    ORDER BY CAST (price AS INT)
    

    【讨论】:

    • 与其采用低效的强制转换,不如将列的类型改为十进制。
    【解决方案4】:

    这可行,但性能不佳

    SELECT price FROM used_cars ORDER BY CAST(price AS int) DESC
    

    【讨论】:

    • CAST(price AS int) 在 CAST(未签名的价格)工作时不起作用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-06
    • 1970-01-01
    • 2021-08-26
    • 2018-02-15
    • 1970-01-01
    • 2021-07-11
    相关资源
    最近更新 更多