增强'ORDER BY'子句以判断条件超过1整数

时间:2010-04-05 19:46:38

标签: php mysql numbers

我有一些PHP代码,允许我按照升序和降序对列进行排序(点击表格行标题),这很好。它适用于我的D.O.B列(具有日期/时间字段类型),但不适用于数量列。

例如,我的数量为10,50,100,30和另外100个。

订单似乎只是欣赏第一个整数,因此我对该列的排序按此顺序排列: 10,100,100,30,50 ...和 50 ,30,100,100,10

这显然是不正确的,因为100大于50,因此100个值肯定会出现在最后?在我看来,100只被考虑为具有'1'值,然后它出现在10之前,因为系统识别它有另一个0。

这是正常的吗?有什么办法可以解决这个问题吗?谢谢你的帮助。附:我可以在必要时显示代码,但是想知道这是否是默认情况下的常见问题。

6 个答案:

答案 0 :(得分:0)

您的字段可能定义为char / varchar / text / ...,即string type而不是numeric type。在那种情况下执行词典排序。

答案 1 :(得分:0)

听起来你正在通过将这些值视为字符串而不是数字来进行排序。什么在做排序? PHP,还是MySQL?如果没有看到实际排序的代码,很难说出错了什么。

答案 2 :(得分:0)

排序是将数据视为字符串而不是整数。检查数据库中列的数据类型。如果这是一个数字而不是一个字符串,那么数据将被转换为数据库和排序例程之间的某个字符串。

答案 3 :(得分:0)

看起来你在排序字符串而不是数字,列的数据类型是什么?正确排序字符串数字的唯一方法是添加前导零,但最好将数据存储在正确的类型中,这样每次选择数据时都不必进行这些操作。

答案 4 :(得分:0)

如果由于某种原因需要将列保留为字符类型,则可以转换为合适的数字类型以进行排序。这比仅更改列效率低。

ORDER BY CAST(theColumn AS DECIMAL(5, 2)) 

http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html

答案 5 :(得分:0)

您的专栏是文字类型。您可以永久更改列类型,也可以在进行排序时进行转换。

表格更改(您可能需要不同的默认值)

 ALTER TABLE [Table]
MODIFY COLUMN [Column] INTEGER UNSIGNED NOT NULL DEFAULT '0';

排序时播放

SELECT *
  FROM [Table]
 ORDER BY CAST([Column] as UNSIGNED INTEGER) ASC;