MySQL:获取每家商店最新价格的产品

时间:2016-01-17 22:25:02

标签: mysql sql

我有下面的两个表格,对于一个产品可能有很多价格条目,我希望输出产品名称以及每个商店的最新产品信息。我正在使用以下但没有得到预期的结果,可能有数百个产品有数百个价格记录,每个都有数百个商店,我这里只有两个作为例子。

产品

product_id | name      | cat_id
---------------------------------
1          | product 1 | 124567
2          | product 2 | 834392
3          | product 3 | 234723

product_id  | price | store | added
--------------------------------------------------
1           | 1.00  | 1     | 2016-01-01 00:00:00
1           | 1.50  | 2     | 2016-01-01 00:00:00
2           | 3.75  | 1     | 2016-01-01 00:00:00
2           | 4.00  | 2     | 2016-01-01 00:10:00
2           | 3.99  | 2     | 2016-01-01 00:00:00
3           | 34.56 | 1     | 2016-01-01 00:00:00

预期输出

name        | price | store | added
--------------------------------------------------
product 1   | 1.00  | 1     | 2016-01-01 00:00:00
product 1   | 1.50  | 2     | 2016-01-01 00:00:00
product 2   | 3.75  | 1     | 2016-01-01 00:00:00
product 2   | 4.00  | 2     | 2016-01-01 00:10:00
proudct 3   | 34.56 | 1     | 2016-01-01 00:00:00

SQL

SELECT `prod`.`name`
, `prc`.`price`
, `prc`.`store`
, `prc`.`added`
FROM `product` `prod`
LEFT JOIN `price` `prc` ON `prod`.`product_id` = `prc`.`product_id`
ORDER BY `prod`.`cat_id` DESC
, `prc`.`added` DESC
, `prc`.`price` DESC;

2 个答案:

答案 0 :(得分:2)

您可以使用NOT EXISTS来消除同一商店/产品存在较新价格的价格行;

SELECT name, price, store, added
FROM product
JOIN price 
  ON product.product_id = price.product_id
WHERE NOT EXISTS (
  SELECT 1 FROM price p 
  WHERE price.product_id = p.product_id
    AND price.store = p.store
    AND price.added < p.added
);

An SQLfiddle to test with

答案 1 :(得分:0)

您的查询应更新为:

SELECT `prod`.`name`
, max(`prc`.`price`)
, `prc`.`store`
, `prc`.`added`
FROM `product` `prod`
LEFT JOIN `price` `prc` ON `prod`.`product_id` = `prc`.`product_id`
group by `prod`.`name`, `prc`.`store`
ORDER BY `prod`.`cat_id` DESC
, `prc`.`added` DESC
, `prc`.`price` DESC;
相关问题