Php MySQL货币格式查询

Php MySQL货币格式查询,php,mysql,pdo,mysqli,Php,Mysql,Pdo,Mysqli,我得到了一个价格表,其值与以下类似: price ----------- 21,781.00 27,615.00 46,565.00 46,565.00 48,565.00 571.00 830.00 0.00 通过执行查询: SELECT * FROM tprice ORDER BY price=0, convert(price, decimal) ASC 我得到以下结果: 21,781.00 27,615.00 46,565.00 46,565.00 48,565.00 571.00

我得到了一个价格表,其值与以下类似:

price
----------- 
21,781.00
27,615.00
46,565.00
46,565.00
48,565.00
571.00
830.00
0.00
通过执行查询:

SELECT * FROM tprice ORDER BY price=0, convert(price, decimal) ASC
我得到以下结果:

21,781.00
27,615.00
46,565.00
46,565.00
48,565.00
571.00
830.00
执行此查询时:

SELECT * FROM tprice ORDER BY price=0, convert(price, decimal) DESC
我明白了

为什么830.00和571.00没有正确订购

编辑: 我已将查询更改为:

SELECT * FROM tprice ORDER BY price=0, replace(',','',price), price ASC
它似乎“稍微好一点”。结果是:

830.00
571.00
48,565.00
46,565.00
46,565.00
27,615.00
21,781.00
0.00
仍在尝试其他变体

SELECT price, CONVERT(REPLACE(REPLACE(price, ",", ""), ".", ""),UNSIGNED INTEGER) formattedPrice
FROM testtest
ORDER BY formattedPrice;
这应该行得通

说明:
您已将数字保存为数据库中的字符串。删除除数字以外的所有内容并将其转换为无符号整数可以解决您的问题。

您的价格似乎是文本字符串(可能存储在
VARCHAR(nn)
列中),包含美式逗号(表示千位分隔符)和点(表示十进制分隔符)

但它们是货币价值。您希望将它们当作
十进制(15,2)
或类似的数据格式来处理

如果你这样做

 ORDER BY CONVERT(REPLACE(price,',',''), DECIMAL(15,2))
在SQL语句的末尾,您将获得所需的排序顺序。这将去掉逗号,然后将剩余字符串转换为十进制

请注意,在尝试对这些值进行算术运算之前,也应该进行此转换。例如,你应该这样做

SELECT CONVERT(REPLACE(price,',',''), DECIMAL(15,2)) AS price,
       CONVERT(REPLACE(price,',',''), DECIMAL(15,2)) * units AS total_price
如果你把价格乘以单位

建议更改数据库结构的注释是正确的,但是您可以使用这些转换来解决有缺陷的数据库设计

这里有一个存储函数来封装转换

DELIMITER $$
DROP FUNCTION IF EXISTS STRING2DECIMAL$$
CREATE FUNCTION STRING2DECIMAL(input VARCHAR(255)
     ) RETURNS DECIMAL(15,2)
    NO SQL
    DETERMINISTIC
    BEGIN
    RETURN CONVERT(REPLACE(input,',',''), DECIMAL(15,2));
END$$
DELIMITER ;
如果您定义了这个,那么您可以编写如下查询

SELECT STRING2DECIMAL(price) AS price,
       STRING2DECIMAL(price) * units AS total_price
  FROM stock
 ORDER BY total_price DESC
它更容易阅读。这意味着更容易正确地完成工作

最后,如果要将数千个分隔符放回显示,请使用FORMAT函数

SELECT FORMAT(STRING2DECIMAL(price) * units, 2) AS total

将数字存储为数字,而不是字符串。字符串是逐字符比较的,
'8'>'4'
'830'>'48565'
。这是最好的方法。问题是,这不是我的设计…但需要想出一个解决方案。但是,谢谢!解决方案是更改表列定义及其类型。@panther:不能这样做。我尝试过并破坏了存储的值…与论坛网站不同,我们不使用“感谢”或“感谢任何帮助”或签名。顺便说一句,这是“提前感谢”,不是“提前感谢”“。只要每个值后面都有一个小数点和两个数字,这就行了。但是没有任何约束可以保证。谢谢,我几分钟前就这么做了,而且效果很好!感谢您花时间发布,非常棒的信息!我很感激,希望它能帮助别人。
SELECT FORMAT(STRING2DECIMAL(price) * units, 2) AS total