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