在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
答案 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所示,此查询使用文件排序进行排序,这并不是很快。如果数据中没有太多行,那么这应该没问题。