MySQL的组加入

问题描述:

SELECT 
    tba.UpdatedDate AS UpdatedDate, 
    tsh.SupplierID, 
    ts.ProductCode as ProductCode, 
    sum(tba.AfterDiscount) as AfterDiscount, 
    sum(tba.Quantity) as Quantity 
FROM 
    tblstockhistory as tsh 
    left join tblstock as ts 
    on tsh.StockID=ts.StockID 
    left join tblbasket as tba 
    on ts.ProductCode=tba.ProductCode 
     and tsh.SupplierID=49 
     AND tba.Status=3 

group by 
    tba.UpdatedDate 
ORDER BY 
    Quantity DESC 

我有供应商表,供应商ID标记在给tblstockhistory表,并且在这种tblstockhistory表包含StockID(从tblstock表引用),我有库存表包含StockID ,产品代码, 和我有tblbasket表,在此我保持了产品代码,MySQL的组加入

我的想法在这里, 我想说明的供应商ID,当我通过供应商ID,它展示秀THW统计,这个供应商提供商品销售统计,

但上面的查询有时会返回空值,它需要太多的时间excution,约50秒,

我是什么样的财产以后下面从上面查询

Date   SupplierID, Amount, Quantity 
2010-12-12  12  12200  20 
2010-12-12  40  10252  30 
2010-12-12  10  12551  50 


2010-12-13  22  1900  20 
2010-12-13  40  18652  30 
2010-12-13  85  19681  50 

2010-12-15  22  1900  20 
2010-12-15  40  18652  30 
2010-12-15  85  19681  50 
+0

为了提高性能,请确保您在连接中使用的所有字段都已编入索引。 – Nazariy 2010-12-13 17:23:37

难道一个tblstockhistory没有stockID永远存在。如果没有,你可以将它转换为可以提供帮助的内部连接。

例如

tblstockhistory as tsh 
INNER join tblstock as ts 
on tsh.StockID=ts.StockID 

你也可以考虑添加索引,如果他们目前不存在。

至少我会将以下字段编入索引,因为它们可能会被共同加入和查询。

  • tblstockhistory.SockID
  • tblstockhistory.SupplierID
  • tblstock.StockID
  • tblstock.ProductCode
  • tblbasket.ProductCode
  • tblBacket.Status
  • tblbasket.UpdatedDate

最后,如果这个查询真的很重要,那么您可以创建汇总表并定期更新它们。

+0

对于哪些字段,我应该在这里创建索引 – Bharanikumar 2010-12-13 17:24:47

+0

StockID,是必需的,因为stockoz只有我们拉ProductCode,ProductCode存储在tblbasket表中, – Bharanikumar 2010-12-13 17:25:58

+0

添加了我最少索引的字段。此外,由于StockID是必需的,我一定会将其更改为Inner Join。您可能还希望从Select中删除ProductCode,因为它看起来不在您的示例输出中。 – 2010-12-13 17:37:17

重新写group by子句的,然后再试一次

group by 
    tba.UpdatedDate, tsh.SupplierID 
您在查询中提到的产品代码,但没有在“结果”你想,如果你想显示的产品代码以及然后将其添加到

按分组分组,或者将其从select子句中删除。

+0

但这是[MySQL](http://stackoverflow.com/questions/1066453/mysql-group逐和阶由/ 1066504#1066504) – 2010-12-13 17:57:59