2015-03-02 122 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