为什么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.相当直截了当地指出的,这种类型的数据可能应该使用十进制,而不是字符串。这是你可以改变的吗?