0

我有两个表需要组合起来才能获得所需的数据,但是给出所需结果的查询都非常昂贵。

我有一个产品表(id、名称)和一个库存表(id、pid、供应商、库存、价格)。stock.pid 是 products.id 的外键,但每个产品可以有多个供应商,因此在 stock 表中有多个条目。

我需要的是每种产品的最便宜价格和当前库存,结合产品记录中的所有数据,按价格升序排列。

我尝试的是(以及几种变体):

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)
4

3 回答 3

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

也许

于 2012-10-03T18:39:07.153 回答
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
于 2012-10-03T18:34:20.603 回答
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 是代表当前时间的数字。它应该是自午夜以来的当前秒数。

于 2012-10-11T09:26:08.407 回答