我已经解决了如下问题,还添加了一个额外的级别,其中考虑了当前时间,因为某些供应商在一天中的某个时间之后无法按时交货。我没有包括的是总和(股票)。我已将该字段作为 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 是代表当前时间的数字。它应该是自午夜以来的当前秒数。