为何MySQL降序查询未按预期返回结果?
问题原因
你通过FORMAT(MIN(pricelist.price),0)生成的price是字符串类型,并非数字类型。MySQL对字符串排序是按字符逐个比较ASCII值,比如你截图里的"1.000"和"999",第一个字符'1'的ASCII值小于'9',所以"999"会排在"1.000"前面,和数字大小的排序逻辑完全不同,导致结果不符合预期。
修复方案
有两种简单的解决办法:
方案1:基于原始数值排序(推荐)
直接用MIN(pricelist.price)这个数值结果排序,格式化仅用于显示:
SELECT product_list.id AS listId, product.prod_name AS prodName, FORMAT(MIN(pricelist.price),0) AS price FROM product_list INNER JOIN product ON product_list.id = product.prod_list_id INNER JOIN pricelist ON product.id = pricelist.prod_id WHERE product_list.id='2' GROUP BY listId, prodName ORDER BY MIN(pricelist.price) DESC
方案2:把格式化后的字符串转回数字再排序
如果一定要用price别名排序,需要先去除千分位分隔符,再将字符串转为数字类型:
SELECT product_list.id AS listId, product.prod_name AS prodName, FORMAT(MIN(pricelist.price),0) AS price FROM product_list INNER JOIN product ON product_list.id = product.prod_list_id INNER JOIN pricelist ON product.id = pricelist.prod_id WHERE product_list.id='2' GROUP BY listId, prodName ORDER BY CAST(REPLACE(price, '.', '') AS UNSIGNED) DESC
注:如果价格包含小数,建议改用
DECIMAL类型转换,比如CAST(REPLACE(price, '.', '') AS DECIMAL(10,2))
内容的提问来源于stack exchange,提问作者Willie Sandi
相关产品推荐
相关产品推荐

