选择按另一列分组的最低价格的行

时间:2017-03-07 04:14:42

标签: mysql

我有这张桌子。

enter image description here

我想选择每个pg_id

价格最低的行

我有这个查询

SELECT
    *, MIN(product_price)
FROM
    `product_group_scrape_history`
GROUP BY
    pg_id;

但它给了我这个结果

请注意第1行的date_scraped列。它的2017-03-01 09:15:17但应该是2017-03-09 06:25:41

enter image description here

1 个答案:

答案 0 :(得分:1)

如果您想在pg_id中找到具有最低价格的行,您可以在子查询中找到每个pg_id的最低价格,然后将其与表格连接以获得所需的结果。

select p1.*
from product_group_scrape_history p1
join (
    select pg_id,
        min(product_price) product_price
    from product_group_scrape_history
    group by pg_id
    ) p2 on p1.pg_id = p2.pg_id
    and p1.product_price = p2.product_price

请注意,如果pg_id的产品价格为多行,则每个pg_id将返回多行。

如果每个pg_id确实需要一行并且产品价格最低,则可以使用用户变量:

select *
from (
    select
        t.*,
        @rn := if(@pg_id = pg_id, @rn + 1, if(@pg_id := pg_id, 1, 1)) rn
    from (
        select *
        from product_group_scrape_history
        order by pg_id, product_price
    ) t, (select @rn := 0, @pg_id := -1) t2
) t where rn = 1;

如果您想在pg_id中找到每个产品的最低价格行,您可以使用:

select p1.*
from product_group_scrape_history p1
join (
    select pg_id,
        product_id,
        min(product_price) product_price
    from product_group_scrape_history
    group by pg_id,
        product_id
    ) p2 on p1.pg_id = p2.pg_id
    and p1.product_price = p2.product_price
    and p1.product_id = p2.product_id;