【问题标题】:mysql group by date with multiple joinmysql 按日期分组,具有多个连接
【发布时间】:2010-12-15 00:51:48
【问题描述】:
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 表的引用),我有 Stock 表包含 StockID、ProductCode、 我有 tblbasket 表,在此维护 ProductCode,

我的想法在这里, 我想按供应商 ID 显示 thw 统计信息,当我传递供应商 ID 时,它会显示显示,该供应商提供的商品销售统计信息,

但上面的查询有时会返回空值,执行时间太长,大约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

【问题讨论】:

  • 为了提高性能,请确保您在连接中使用的所有字段都已编入索引。

标签: sql mysql


【解决方案1】:

没有stockID 是否存在tblstockhistory。如果不是,您可以将其转换为可以提供帮助的内部联接。

例如

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

最后,如果此查询的快速简化真的很重要,您可以创建汇总表并定期更新它们。

【讨论】:

  • 我应该在这里为哪些字段创建索引
  • StockID, 是必需的,因为只有 stockid 我们才拉取 ProductCode,ProductCode 存储在 tblbasket 表中,
  • 添加了我至少会索引的字段。此外,由于需要 StockID,我肯定会将其更改为 Inner Join。您可能还想从 Select 中删除 ProductCode,因为它似乎不在您的示例输出中。
  • 你在 ts.ProductCode=tba.ProductCode OR ts.ProductCode as ProductCode 上说这一行
  • 我的意思是 ts.ProductCode 作为 ProductCode
【解决方案2】:

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

group by 
    tba.UpdatedDate, tsh.SupplierID

您在查询中提到了 ProductCode,但在您想要显示 ProductCode 的“结果”中没有提到,然后将其添加到 group by 子句或从 select 子句中删除。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-12
  • 2011-12-30
  • 1970-01-01
  • 2015-11-09
  • 2020-08-30
  • 1970-01-01
相关资源
最近更新 更多