网站首页mysql

Mysql子查询排序失效的解决方案

发布时间:2019-11-14 04:22:06编辑:slayer.hover阅读(5608)

    现有一批商品存于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秒左右, 将就用吧。


    或者分两步:

    1.  先找到最低价

    SELECT goods_name, min(price) as min_price FROM goods WHERE  GROUP BY goods_name


    2.  用最低价去找对应的商户

    SELECT e_commerce FROM goods WHERE price=$min_price AND goods_name=$goods_name



评论