从每个商店的 table 个产品价格中获取产品的最低价格
Get the lowest price for a product from a table of product prices per store
我正在制作一个网站来比较不同商店之间的产品价格。我创建了一个搜索功能,我想在其中显示当前的最低价格,这是我有点卡住的地方。
我有一个 table Products
的基本信息和一个 table product_store
的不同商店不同产品的奖品。以下是这些 table 的数据库的基本架构:
+-----------+ +---------------+
| products | | product_store |
+-----------+ +---------------+
| id | | product_id |
| name | | store_id |
+-----------+ | price |
| created_at |
+---------------+
product_store
table 对相同的 product_id
和 store_id
有多个价格,因此我可以创建价格历史记录。
现在我想创建一个查询以获取所有产品及其当前的最低价格。所以,你取每个商店的最高价格 created_at
,我想从这个集合中获得最低值。
这是我目前尝试过的方法:
select products.*, prices.price
from products
left join (
SELECT p1.product_id, min(p1.price) as price, p1.created_at
FROM product_store p1
WHERE p1.created_at = (SELECT max(created_at) FROM product_store p2 WHERE p2.store_id = p1.store_id
) as prices
on prices.product_id = products.id
我搜索每个商店和产品的最高 created_at
并获得这些行的最低价格。然而,这会产生一些非常奇怪的结果,其中产品之间的价格混淆,而一些有价格的产品在结果中没有任何价格。
有人可以帮我为这个问题创建一个好的查询吗?
提前致谢。 :)
这是一种方法。它聚合 product_store
table 以获得每个商店的最大创建日期。然后它将它连接回 table 以获得 price
最后在外部查询中进行聚合:
select p.*, min(ps.price)
from products p left join
(select ps.product_id, ps.store_id, max(created_at) as maxca
from product_store ps
group by ps.product_id, ps.store_id
) pssum
on pssum.product_id = p.id left join
product_store ps
on ps.product_id = pssum.product_id and
ps.store_id = pssum.store_id and
ps.created_at = pssum.maxca
group by p.id;
您的 product_store
table 是一个缓慢变化维度的例子。如果它设置了 eff_date
和 end_date
(生效日期和结束日期)列,那么查询将更容易编写,并且在性能方面可能更高效。
我正在制作一个网站来比较不同商店之间的产品价格。我创建了一个搜索功能,我想在其中显示当前的最低价格,这是我有点卡住的地方。
我有一个 table Products
的基本信息和一个 table product_store
的不同商店不同产品的奖品。以下是这些 table 的数据库的基本架构:
+-----------+ +---------------+
| products | | product_store |
+-----------+ +---------------+
| id | | product_id |
| name | | store_id |
+-----------+ | price |
| created_at |
+---------------+
product_store
table 对相同的 product_id
和 store_id
有多个价格,因此我可以创建价格历史记录。
现在我想创建一个查询以获取所有产品及其当前的最低价格。所以,你取每个商店的最高价格 created_at
,我想从这个集合中获得最低值。
这是我目前尝试过的方法:
select products.*, prices.price
from products
left join (
SELECT p1.product_id, min(p1.price) as price, p1.created_at
FROM product_store p1
WHERE p1.created_at = (SELECT max(created_at) FROM product_store p2 WHERE p2.store_id = p1.store_id
) as prices
on prices.product_id = products.id
我搜索每个商店和产品的最高 created_at
并获得这些行的最低价格。然而,这会产生一些非常奇怪的结果,其中产品之间的价格混淆,而一些有价格的产品在结果中没有任何价格。
有人可以帮我为这个问题创建一个好的查询吗?
提前致谢。 :)
这是一种方法。它聚合 product_store
table 以获得每个商店的最大创建日期。然后它将它连接回 table 以获得 price
最后在外部查询中进行聚合:
select p.*, min(ps.price)
from products p left join
(select ps.product_id, ps.store_id, max(created_at) as maxca
from product_store ps
group by ps.product_id, ps.store_id
) pssum
on pssum.product_id = p.id left join
product_store ps
on ps.product_id = pssum.product_id and
ps.store_id = pssum.store_id and
ps.created_at = pssum.maxca
group by p.id;
您的 product_store
table 是一个缓慢变化维度的例子。如果它设置了 eff_date
和 end_date
(生效日期和结束日期)列,那么查询将更容易编写,并且在性能方面可能更高效。