使用$ sign和逗号按价格订购

时间:2011-06-10 14:30:22

标签: php mysql

我的数据库中有一个名为“price”的字段,它设置为varchar。它包含美元符号以及逗号。

我的数据库中的值是这样的:

$ 100,000
$六十二万五千〇五
$一十一万五千九百九十零
$ 2,450,000
$一十三万七千○五

我希望它能像这样订购:

$ 100,000
$一十一万五千九百九十零
$一十三万七千○五
$六十二万五千〇五
$ 2,450,000

我尝试了ORDER BY 0 +价格和ORDER BY ABS(价格),但他们只是按照它在数据库中的顺序输出。无论如何要在保持字段varchar

的同时订购它

5 个答案:

答案 0 :(得分:9)

如果可能,请更改数据库以在intfloatdecimal字段中保留这些值,具体取决于您需要多少精度。输出值时添加$和所有其他格式。

其他所有内容只是围绕错误的数据库结构进行管道录制。这并非不可能,但是当绝对没有办法改变数据库时,它应该是最后的手段。

答案 1 :(得分:2)

完全同意上述有关数据库设计的帖子,无论如何都有不好的方法:

SELECT REPLACE(REPLACE(price,',',''),'$','') as cleanPrice FROM Table ORDER BY cleanPrice

查询必须在每一行上进行替换,因此可能会变得很慢..

答案 2 :(得分:1)

老实说,当你把它们带出数据库时,你应该把这些存储为int并在PHP中格式化,这样就可以更容易地处理数据,你可以将它们作为INT来操作。

当你把它们拉出来时,你可以使用numeric_format自动添加逗号,然后只需添加价格的$ $。

如果您要存储多种类型的价格,您也可以在货币类型中存储货币类型;在这种情况下,这将是美元。

答案 3 :(得分:1)

我在Oracle中很快就这样做了,所以它在MySQL中可能不起作用......如果没有,我很抱歉。我只选择价格

select price
from table
order by (cast(substr(replace( replace('price', ',', ''), '"', '' ), 2, length(replace( replace('price', ',', ''), '"', '' ))-1) as int)

答案 4 :(得分:1)

如果您无法更改数据库结构,可以向表中添加计算列以进行排序。

不幸的是,mysql不支持计算列,因此在创建新列之后,您需要添加触发器(在UPDATE和INSERT上)来计算表中每个插入/更改行的值。

在触发器中,您将使用REPLACE(REPLACE('price,'$',''),',','')作为新列的值。

您还可以创建一个包含此逻辑的视图,然后从中进行选择。

用于创建触发器的mysql文档位于here

使用视图的mysql文档位于here