Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么MySQL中的排序不能正常工作?_Mysql_Sorting - Fatal编程技术网

为什么MySQL中的排序不能正常工作?

为什么MySQL中的排序不能正常工作?,mysql,sorting,Mysql,Sorting,我的表名为price,数据类型为varchar(25)。在查询中,我获取值45000、32000、420、237和180,并按升序对它们进行排序。它给我的结果是180、237、32000、420、45000,但我不知道为什么它会按照前三位进行排序,如果其中一位是三位数字,如果所有数字都是四位数字,那么它工作正常。任何解决方案都将不胜感激 我在查询中使用了CAST(prix为十进制),但它仍然不起作用 查询的某些部分,我正在用prix case进行排序 WHEN (_flg_asc_desc =

我的表名为
price
,数据类型为
varchar(25)
。在查询中,我获取值45000、32000、420、237和180,并按升序对它们进行排序。它给我的结果是180、237、32000、420、45000,但我不知道为什么它会按照前三位进行排序,如果其中一位是三位数字,如果所有数字都是四位数字,那么它工作正常。任何解决方案都将不胜感激

我在查询中使用了
CAST(prix为十进制)
,但它仍然不起作用

查询的某些部分,我正在用prix case进行排序

WHEN (_flg_asc_desc = 0 AND _order_by_flg = 1) THEN CAST(a.prix as decimal)
见下文

ORDER BY
CASE 
    WHEN (CAST(a.prix as decimal) IS NULL 
    OR CAST(a.prix as decimal) = 'NA' 
    OR CAST(a.prix as decimal) = 'N/A' 
    OR CAST(a.prix as decimal) = '') THEN 1 ELSE 0 
END,
CASE 
    WHEN (CAST(a.surface as decimal) IS NULL 
    OR CAST(a.surface as decimal) = 'NA' 
    OR CAST(a.surface as decimal) = 'N/A' 
    OR CAST(a.surface as decimal) = '') THEN 1 ELSE 0 
END,
CASE 
    WHEN (_flg_asc_desc = 0 AND _order_by_flg = 0) THEN a.date_last_modif 
    WHEN (_flg_asc_desc = 0 AND _order_by_flg = 1) THEN CAST(a.prix as decimal) //   <==== My case in sorting prix
    WHEN (_flg_asc_desc = 0 AND _order_by_flg = 2) THEN CAST(a.surface as decimal) 
END ASC,

CASE 
    WHEN (_flg_asc_desc = 1 AND _order_by_flg = 0) THEN a.date_last_modif 
    WHEN (_flg_asc_desc = 1 AND _order_by_flg = 1) THEN CAST(a.prix as decimal) //   <==== My case in sorting prix
    WHEN (_flg_asc_desc = 1 AND _order_by_flg = 2) THEN CAST(a.surface as decimal) 
END DESC
orderby
案例
当(强制转换(a.prix为十进制)为空时
或强制转换(a.prix为十进制)=“NA”
或强制转换(a.prix为十进制)=“不适用”
或强制转换(a.prix为十进制)='',然后1或0
完,,
案例
当(转换为十进制的曲面)为空时
或强制转换(以十进制表示的曲面)=“NA”
或强制转换(以十进制表示的曲面)=“不适用”
或强制转换(十进制表面)='',然后1或0
完,,
案例
当(_flg_asc_desc=0和_order_by_flg=0)时,则a.date_last_modif

当(_flg_asc_desc=0和_order_by_flg=1)然后强制转换(a.prix为十进制)/时,因为数据是字符串(VARCHAR),数据库按字母顺序排序,而不是按数字排序。必须在order by子句中强制转换为整数(十进制),才能进行数字排序


如果您想了解更多详细信息,请发布您的代码片段,以便我们查看语法。

对于未定义的定价值,您可以使用
null
。还有别的吗?如果你使用MySQL的好人给你的工具,你的问题就完全消失了,这不是很有趣吗?好吧,这是你的客户和你的项目。如果不能执行简单的
If(db_column==null)printf(“N/A”)或类似于您选择的语言,那么我真的,真的很遗憾选择您的那个可怜的客户。你被认为是专业人士。说因为
N/A
您需要使用错误的数据类型、错误的排序方法,而不仅仅是因为您在提取数据时懒得做一次简单的检查,这是一个糟糕的借口。真是糟糕的借口。我祝你在未来的项目中好运,希望你不再重复同样的错误。哇,好吧,这是一个复杂的按条款排序的过程:而且它看起来确实是多余的,没有必要的。此外,在许多地方,您将动态大小写小数与字符串进行比较,从而使动态强制转换无效。正如N.B.相当直截了当地指出的,这种类型的数据可能应该使用十进制,而不是字符串。这是你可以改变的吗?