Mysql排序价格,当价格千到K,百万到M

时间:2018-11-20 10:56:53

标签: mysql sql phpmyadmin

在MySQL数据库中,价格的存储方式如下:

98.06K
97.44K
929.14K
91.87K
2.66M
146.64K
14.29K

当我尝试对价格ASC或价格DESC进行排序时,它将返回意外结果。

请建议我如何在价位内对价格进行排序 10K,20M,1.6B

我想要结果

14.29K
91.87K
97.44K
98.06K
146.64K
929.14K
2.66M

3 个答案:

答案 0 :(得分:3)

当将字符串转换为数字时,MySQL会忽略尾随的非数字。这将返回正确的价格:

price * 
case right(price,1)
  when 'K' then 1000
  when 'M' then 1000000
  else 1
end

当然,您可以以此订购,但是最好在加载期间应用它,并将价格存储在数字列中。

答案 1 :(得分:1)

问题出在您的数据模型上。我知道2.66M不一定精确地是266万,这就是为什么您不想存储整数,而是存储“ 2.66M”以指示精度的原因。但是,这是两条信息:值和精度,因此请使用两列:

mytable

value  | unit
-------+-----
 98.06 | K
 97.44 | K
929.14 | K
 91.87 | K
  2.66 | M
146.64 | K
 14.29 | K

连同查找表:

units

unit | factor
-----+--------
K    |    1000
M    | 1000000

可能的查询是:

select *
from mytable
join units using (unit)
order by mytable.value * units.factor;

您可能希望将ORDER BY子句扩展到类似

的地方
order by mytable.value * units.factor, units.factor;

或应用四舍五入或考虑两个看似相等的值的精度。

答案 2 :(得分:0)

有可能,尽管不建议这样做:

https://dbfiddle.uk/?rdbms=mariadb_10.3&fiddle=0a837287c7646823fa6657706f9ae634

brew install r

为什么不建议?如dbfiddle中的Explain所示,此查询使用文件排序进行排序,这并不是很快。如果数据中没有太多行,那么这应该没问题。