2015-03-02 54 views
0

我有一个包含大量行的表,并且在子查询上效率非常低。我无法围绕如何对数据进行加入来节省时间。将MySQL子查询重写为连接

以下是我有: http://sqlfiddle.com/#!2/6ab0c/3/0

+1

对不起。我现在正在运行的错误是我试图将连接的表的日期与主选择日期值关联起来。这不会让我这样做。即我的选择表是t1,我的连接表是t2。当我尝试在我的连接中指定t2.date> t1.date时,它会抛出[Err] 1054 - 'where子句'中的未知列't1.date',我通常很擅长在我自己上找到答案,但这一个正在困扰着我。 – user3253255 2015-03-02 22:05:06

回答

1

这是有点长了评论。

首先,我认为你在子查询中缺少ORDER BY。我怀疑你想order by I2.date获得“下一个”行。

其次,MySQL并不完全提供您需要的功能。您可以使用变量重写查询。但是,因为你没有描述它在做什么,所以很难确定重写是正确的。这是加快查询的一种方法。第三,这个查询要快得多 - 而且速度可能够快 - 在items(location, sku, date)上有一个索引。该索引可能是您所需要的。

+0

你对我错过的订单是正确的。 我不太了解你的第二点。 我不幸没有控制权来修改当前的表格设计。我试图在没有添加索引的情况下进行应有的操作,实际上我甚至无法确定表上是否有索引。 – user3253255 2015-03-02 22:08:57

+0

@ gordon-linoff是正确的,你所要做的只是使用变量而不是连接来实现,它只将日期与下一个日期进行匹配。 – bluecollarcoder 2015-03-02 22:47:49

0
SELECT I1.*, MIN(I2.exit_date) 
FROM Items I1 

LEFT JOIN (
    SELECT date as exit_date, location, sku 
    FROM Items 
    ORDER BY date asc 
) as I2 
ON I2.exit_date > I1.date 
    AND I2.location = I1.location 
    AND I2.sku = I1.sku 
GROUP BY I1.id