网站首页mysql
Mysql子查询排序失效的解决方案
发布时间:2019-11-14 04:22:06编辑:slayer.hover阅读(4439)
现有一批商品存于goods表,各个电商均有报价,要取出最低价的那家记录。
goods表各字段说明
商品名:goods_name
报 价:price
电商名:e_commerce
看起来挺简单,好像先排序后分组取第一条就可以:
SELECT * FROM ( SELECT * FROM goods ORDER BY price ASC ) AS p GROUP BY goods_name
然而, 查出来的并非最低价的记录,网上查了一下,在MySQL子查询中使用order by语句后查询结果并不会显示排序后的结果。
那就只好用聚合函数来处理了:
SELECT * FROM ( SELECT a.* FROM goods a RIGHT JOIN (select goods_name, min(price) as min_price from goods group by goods_name ) b ON a.goods_name=b.goods_name AND a.price=b.min_price ) p GROUP BY p.goods_name
用(主表)a和(聚合分组查到的最低价记录)b进行右关联, 这样查出来的就是所有含最低价的报价,
因为每个商品的最低报价可能不止一条,多家报价可能会是同一个价格,
所以再按商品名分组取首条就是所有商品的最低报价记录了。
--------------------------------------执行效率分割线--------------------------------------------
然鹅, 这SQL效率太低了, 30W条记录的表, 一次执行要5秒多, 这可不行。
SELECT * FROM ( SELECT * FROM goods WHERE GROUP BY goods_name, price ASC ) AS p GROUP BY p.goods_name
这样改造后, 基本执行时间保持在0.1秒左右, 将就用吧。
评论