如何选择产品的最新价格? [复制]
Posted
技术标签:
【中文标题】如何选择产品的最新价格? [复制]【英文标题】:How to select the latest price for product? [duplicate] 【发布时间】:2019-02-13 11:51:43 【问题描述】:这是我的桌子:
+----+------------+-----------+---------------+
| id | product_id | price | date |
+----+------------+-----------+---------------+
| 1 | 4 | 2000 | 2019-02-10 |
| 2 | 5 | 1600 | 2019-02-11 |
| 3 | 4 | 850 | 2019-02-11 |
| 4 | 5 | 1500 | 2019-02-13 |
+----+------------+-----------+---------------+
我需要获取最新的唯一产品 ID 列表(最新的,换句话说,更大的 date
)。所以这是预期的结果:
+------------+-----------+---------------+
| product_id | price | date |
+------------+-----------+---------------+
| 4 | 850 | 2019-02-11 |
| 5 | 1500 | 2019-02-13 |
+------------+-----------+---------------+
知道如何实现吗?
这是我的查询:
SELECT id, product_id, price, MAX(date)
FROM tbl
GROUP BY product_id
-- ot selects the max `date` with random price like this:
+------------+-----------+---------------+
| product_id | price | date |
+------------+-----------+---------------+
| 4 | 2000 | 2019-02-11 |
| 5 | 1600 | 2019-02-13 |
+------------+-----------+---------------+
-- See? Prices are wrong
【问题讨论】:
哪个 mysql 版本? 也许这可以帮助你:***.com/questions/5191503/…问候 【参考方案1】:您可以使用相关子查询
select t1.* from table t1
where t1.date=( select max(date) from table t2
where t1.product_id=t2.product_id
)
【讨论】:
【参考方案2】:Select *from
table1 t1
where (t1.product_id, t1.date) in
(select t2.product_id, max(t2.date)
from table1 t2
where t1.product_id = t2.product_id
)
【讨论】:
您可以通过删除子查询中的where子句来删除相关性并使用group by product_id
。
是的,我可以这样做,也可以从内部查询中删除 group by
。我已经做了后面的。但是你认为哪一个更好?【参考方案3】:
不要使用GROUP BY
。使用过滤器:
SELECT id, product_id, price, MAX(date)
FROM tbl
WHERE tbl.date = (SELECT MAX(t2.date)
FROM tbl t2
WHERE t2.product_id = tbl.product_id
);
在(product_id, date)
上有索引,这可能是最快的方法。
如果您可以在给定日期有重复,您可以通过以下方式解决它们:
SELECT id, product_id, price, MAX(date)
FROM tbl
WHERE tbl.id = (SELECT t2.id
FROM tbl t2
WHERE t2.product_id = tbl.product_id
ORDER BY t2.date DESC
LIMIT 1
);
【讨论】:
【参考方案4】:我的解决方案是使用解析函数first_value
SELECT distinct product_id,
first_value(price) over (partition by product_id order by date desc) last_price,
first_value(date) over (partition by product_id order by date desc) last_date
FROM tbl
【讨论】:
【参考方案5】:假设您使用的是现代版本的 MySQL (8.0),您可以使用这个:
select *
from (
SELECT id
, product_id
, price
, date
, row_number() over (partition by product_id order by date desc) rn
FROM tbl
) a
where rn = 1
【讨论】:
以上是关于如何选择产品的最新价格? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
添加将更改 Woocommerce 简单产品中价格的选择字段