MySQL每种产品的最低和最新价格
我有三张桌子MySQL每种产品的最低和最新价格,mysql,sql,Mysql,Sql,我有三张桌子 price_history (Primary: id) +----+------------+------+---------+-------+------------+ | id | id_product | sku | id_shop | price | date_add | +----+------------+------+---------+-------+------------+ | 1 | 11 |
price_history (Primary: id)
+----+------------+------+---------+-------+------------+
| id | id_product | sku | id_shop | price | date_add |
+----+------------+------+---------+-------+------------+
| 1 | 11 | 101 | 1001 | 10 | 2017-07-01 |
| 2 | 12 | 101 | 1002 | 15 | 2017-07-01 |
| 3 | 13 | 101 | 1003 | 20 | 2017-07-01 |
| 4 | 11 | 101 | 1001 | 11 | 2017-07-02 | <-- lowest latest
| 5 | 14 | 102 | 1001 | 45 | 2017-07-01 |
| 6 | 15 | 102 | 1002 | 45 | 2017-07-01 |
| 7 | 16 | 102 | 1003 | 45 | 2017-07-01 | <-- shop 1003 is the lowest,
latest among shops and should not be display, because the shop monitored is 1001
| 8 | 15 | 102 | 1002 | 60 | 2017-07-02 |
| 9 | 14 | 102 | 1001 | 55 | 2017-07-02 |
|10 | 17 | 103 | 1001 | 90 | 2017-07-01 |
|11 | 18 | 103 | 1002 | 90 | 2017-07-01 |
|12 | 19 | 103 | 1003 | 90 | 2017-07-01 |
|13 | 17 | 103 | 1001 | 100 | 2017-07-02 | <-- lowest latest
|14 | 18 | 103 | 1002 | 100 | 2017-07-02 |
|15 | 19 | 103 | 1003 | 100 | 2017-07-02 |
+----+------------+------+---------+-------+------------+
product (primary: id_product)
+------------+---- ---+-----+--------------+---------+
| id_product | active | sku | product_name | id_shop |
+------------+--------+-----+--------------+---------+
| 11 | 1 | 101 | Red | 1001 |
| 12 | 1 | 101 | A bit red | 1002 |
| 13 | 1 | 101 | Very red0 | 1003 |
| 14 | 1 | 102 | Blue | 1001 |
| 15 | 1 | 102 | A bit blue | 1002 |
| 16 | 1 | 102 | Very blue | 1003 |
| 17 | 1 | 103 | Green | 1001 |
| 18 | 1 | 103 | A bit green | 1002 |
| 19 | 1 | 103 | Very green | 1003 |
| 20 | 0 | 104 | Discontinued | 1001 |
| 21 | 0 | 104 | Out of stock | 1002 |
| 22 | 0 | 104 | Varnish | 1003 |
+------------+--------+-----+--------------+---------+
shop (primary: id_shop)
+---------+--------+
| id_shop | name |
+---------+--------+
| 1001 | Shop A |
| 1002 | Shop B |
| 1003 | SHop C |
+---------+--------+
最后,我只需向受监控的店铺显示“店铺A”
预期结果:
+----+------------+------+---------+-------+
| id | id_product | sku | id_shop | price |
+----+------------+------+---------+-------+
| 4 | 11 | 101 | 1001 | 11 |
|13 | 17 | 103 | 1001 | 100 |
+----+------------+------+---------+-------+
sku 102的最低价格是1003店,所以我们不需要展示它们
JSFIDLE
多谢各位
需要帮助,仍未找到解决方案这将为您提供商店每个sku的最大添加日期
SELECT sku, MAX(date_add)
FROM price_history
WHERE id_shop = 1001
GROUP BY sku;
然后,您可以将其包装到另一个查询中,并再次使用price\u history
连接,以获得结果,例如:
SELECT ph.id, ph.id_product, ph.sku, ph.id_shop, ph.price
FROM proce_history ph JOIN (
SELECT sku, MAX(date_add) AS `date_add`
FROM price_history
WHERE id_shop = 1001
GROUP BY sku
) a ON ph.sku = a.sku AND ph.date_add = a.date_add;
您只需使用带有limit子句的相关子查询即可实现这一点:
select *
from price_history h
where id_shop = 1001
and id = (select id
from price_history p
where h.sku = p.sku
and h.id_shop = p.id_shop
order by date_add desc, price asc
limit 1
);
以上是简单的解决方案,但对于较大的数据集,可能会遇到性能问题
然后,您可以使用以下基于联接的解决方案:
select *
from price_history
join (
select sku, date_add, min(price) as price
from price_history
join (
select sku, max(date_add) as date_add
from price_history
where id_shop = 1001
group by sku
) t using (sku, date_add)
where id_shop = 1001
group by sku, date_add
) t using (sku, date_add, price)
where id_shop = 1001
或
展示你的预期结果too@JYoThI预期结果added@Gurwinder辛格:是的,你是对的<代码>日期\u添加
added@GurwinderSingh第二个符号是102,那么,在你的例子中,11
是最新的,但不是最低的?哪一个是11?id\u product或id?@在表中需要时间戳列。这将解决问题。我有一个问题要问你,你在什么基础上说它是最低的,这个值是最新的。所以您需要时间戳列,然后是u最小时间戳和最大时间戳sku@karanaroradate\u add
added这可能是最简单的。我怀疑嵌套的不相关子查询会更快。@草莓-是。。我已经添加了基于联接和子查询的解决方案。@Gurvinder Singh更正了第二个价格\u历史sku 102@inMILD该行怎么是最新的最低价格?不应该选择最新日期和最低价的行吗?我想我还是不完全理解你的逻辑。@Gurvindersingh因为1003店没有为sku 102增加新的价格,他是其他店中价格最低的,而他的价格是他自己最新的。
select *
from price_history
join (
select sku, date_add, min(price) as price
from price_history
join (
select sku, max(date_add) as date_add
from price_history
where id_shop = 1001
group by sku
) t using (sku, date_add)
where id_shop = 1001
group by sku, date_add
) t using (sku, date_add, price)
where id_shop = 1001
select *
from price_history
join (
select sku, date_add, id_shop, min(price) as price
from price_history
join (
select sku, id_shop, max(date_add) as date_add
from price_history
where id_shop = 1001
group by sku, id_shop
) t using (sku, date_add, id_shop)
group by sku, date_add, id_shop
) t using (sku, date_add, price, id_shop);