MySQL高效的查询查询

时间:2012-10-03 18:31:06

标签: mysql

我需要组合两个表来获取我需要的数据,但是提供所需结果的查询都非常昂贵。

我有产品表(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)

3 个答案:

答案 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是表示当前时间的数字。它应该是自午夜以来的当前秒数。