我需要组合两个表来获取我需要的数据,但是提供所需结果的查询都非常昂贵。
我有产品表(id,名称)和库存表(id,pid,供应商,库存,价格)。 stock.pid是products.id的外键,但每个产品可以有多个供应商,因此库存表中有多个条目。
我需要的是每种产品最便宜的价格和当前库存,再加上产品记录中的所有数据,按价格上涨计算。
我尝试的是(以及几种变体):
SELECT DISTINCT(pid), MIN(price), stock, p.*
FROM stock s LEFT (INNER) JOIN
product
ON pid = s.id
GROUP BY pid
ORDER BY price (LIMIT 100)
答案 0 :(得分:1)
庵
Select products.*,stock.stock,cheapest.cheapestprice
From (select id,Min(Price) as cheapestPrice From Stock Group By id) cheapest
inner join Stock on stock.id = cheapest.id
inner join products on product.id = stock.pid
Order by cheapest.cheapestprice
也许
答案 1 :(得分:0)
您希望使用子查询执行此操作:
select p.*, sumstock, minprice
from products p left outer join
(select s.pid, sum(stock) as sumstock, min(price) as minprice
from stock s
group by s.pid
) sp
on sp.pid = p.id
order by minprice
答案 2 :(得分:0)
我已经解决了以下问题,并在考虑当前时间的情况下增加了额外的水平,因为有些供应商无法在一天中的某个时间后准时交货。我没有包括的是一笔金额(股票)。我已将该字段添加到产品表中作为sumStock,并且每当更改库存记录时始终更新它。
SELECT sp.price
, p.*
FROM products p
LEFT JOIN stock_products sp
USING (ean)
WHERE sp.id = IFNULL(
(SELECT psi.id
FROM stock_products psi
JOIN suppliers sup
ON psi.pid = sup.id
WHERE psi.ean = p.ean
AND psi.stock > 0
ORDER BY IF(sup.time>40667, sup.deliveryTime, sup.deliveryTime+86400)
, price
LIMIT 1)
,
(SELECT psi.id
FROM stock_products psi
JOIN suppliers sup
ON psi.pid = sup.id
WHERE psi.ean = p.ean
ORDER BY IF(sup.time>40667, sup.deliveryTime, sup.deliveryTime+86400)
, price
LIMIT 1)
ORDER BY price
请注意,我在产品没有库存的罕见情况下使用IFNULL。我还是想展示那些记录。查询有点短,但没有,但这是我最终使用的完整解决方案。
此外,40667是表示当前时间的数字。它应该是自午夜以来的当前秒数。