【问题标题】:order by budget high to low or low to high按预算从高到低或从低到高排序
【发布时间】:2018-03-15 05:40:55
【问题描述】:

从高到低:

$query="select * from sponsors order by budget DESC"; 

从低到高:

$query="select * from sponsors order by budget "; 

执行此查询时,它仅按第一个数字排序。例如:

预算: 95,00,000 6,00,000 3,00,000 29,58,000 22,78,000

我做错了什么?

【问题讨论】:

  • 预算值是否只是带有逗号的数字?
  • 不,它不仅仅是数字,它像 6,00,00 p.a 或预算正在进行中......

标签: mysql sql database sql-order-by


【解决方案1】:

解决此问题的“正确”方法是重新构建表格并将预算拆分为两个字段,一个 int 和一个 varchar,用于描述 int 所指的内容,例如“p.a”或“持续”或“每月”或其他。这样您就可以按 int 字段正确排序数据。

在此期间,您应该能够通过从字段的数字部分中去除逗号然后将其转换为无符号整数来对数据进行排序:

SELECT *
  FROM sponsors
  ORDER BY CAST(REPLACE(budget, ',', '') AS UNSIGNED)

只要所有预算值都以可能包含或不包含逗号的数字开头,这应该可以工作。

【讨论】:

    【解决方案2】:

    我认为您的列数据类型是 char,所以请确保您使用 int 数据类型作为列。

    【讨论】:

    • 是的它的 varchar ,但是当我使用 int 时,我不能在 btwn 数字中使用逗号..所以它可以在 int 中使用逗号
    • 您可以使用 cast 或 convert 功能。 ORDER BY CAST(column AS DECIMAL(10,2)) DESC
    • 带 int 或 varcahr ?
    • 您可以在选择查询中将 varchar 数据类型转换为十进制。
    • 警告:mysql_fetch_array() 期望参数 1 是资源.. 当我使用此查询时显示此错误
    【解决方案3】:

    ANSI SQL 中的 ORDER BY(您没有指定特定的 sql 变体;这会有所帮助:-)取决于列定义。

    如果您想按数值排序(而不是基于字符串 - 如果我们猜测,这里看起来像 char/varchar/text 列),您需要使用数值列类型,例如,INT、FLOAT、DECIMAL 等。

    换句话说,您需要告诉 SQL(通过您的架构)您有专门的数字数据。 10 在基数 10 中仅小于 3。:-)

    【讨论】:

    • 我使用 varcahr 因为数据是 6,00,000 P.A
    【解决方案4】:

    您需要将预算存储为数字数据类型,例如数据库中的无符号INT or BIGINT

    目前,ORDER 会将所有数据视为 TEXT。这就是他们按第一位数字排序的原因。

    【讨论】:

    • 如果预算是 6,00,000 p.a ..?
    【解决方案5】:

    你可以试试这个

    SELECT * 
    FROM sponsors 
    ORDER BY cast(budget as int)
    

    如果这是你的列值 (6,00,00 p.a)

      SELECT * 
        FROM sponsors 
        ORDER BY cast(LEFT(budget,length(budget)-3) as int)
    

    【讨论】:

    • 我在这个查询中使用了哪种数据类型?
    • 警告:mysql_fetch_array() 期望参数 1 是资源.. 当我使用此查询时显示此错误,我的数据类型是 int..