2011-10-07 28 views
-1

我可以得到我需要的結果,但我需要一個快速查詢。使用快速MySQL查詢查找組中的最後一個值和以前的值

id  value1  fid 
1000 1203  5 
1001 1293  1 
1002 1203  3 
1003 1211  1 
1004 1263  1 
1005 1223  5 
1006 1243  2 
1007 123   5 
1008 1049  2 
1009 1205  3 

這裏有我需要的結果:

fid id  value1  id2  previous_value1 
1 1004 1263  1003 1211 
2 1008 1049  1006 1243 
3 1009 1205  1002 1203 
5 1007 123   1005 1223 

任何想法?


編輯:我忘了寫我的查詢,這裏是我的查詢:

SELECT 
t1.fid, 
t1.id, 
t1.value1, 
t2.id AS id2, 
t2.value1 AS previous_value1 
FROM 
(
    SELECT 
    MAX(id) AS id 
    FROM TABLENAME 
    GROUP BY fid 
) t3 
INNER JOIN TABLENAME t1 ON t1.id = t3.id 
INNER JOIN TABLENAME t2 ON t2.id = (SELECT id FROM TABLENAME WHERE id < t1.id AND fid =  t1.fid ORDER BY id DESC LIMIT 1) 

其實我通過去除多餘的列簡化它。

(有一個在WHERE語句2個列,但它沒有問題。)

原來的查詢需要〜0.04秒。如果我用where語句中的其他兩列過濾結果,則需要大約0.001秒。

+0

系統,您的問題,請 – JellyBelly

+3

這是一種曼薩難題來猜測這個問題嗎? –

+0

@Jet Php這個問題,正如所寫的,非常多的問題是「我明白了,現在讓我們看看你能不能」,我敢肯定這不是你要找的語氣。向我們展示您的解決方案會很有幫助,並讓我們建議對* it *進行改進。謝謝。 :) –

回答

0

好吧,這裏是一個查詢,返回你想要的東西(至少,我認爲你想要的),但它決不是快速,高效的,所以先試試吧:

SELECT A.*, 
     (SELECT TOP 1 id FROM YourTable WHERE fid = A.fid AND id < B.MaxId ORDER BY id DESC) Id2, 
     (SELECT TOP 1 value1 FROM YourTable WHERE fid = A.fid AND id < B.MaxId ORDER BY id DESC) previous_value1 
FROM YourTable A 
INNER JOIN (SELECT fid, MAX(id) Maxid 
      FROM YourTable 
      GROUP BY fid) B 
ON A.id = B.Maxid 
ORDER BY A.fid 
+0

Hi Lamak,謝謝你的迴應。我對您的建議使用了類似的查詢,但我想知道是否有快速技術。 –

+0

我最終複製了表格。超過時,每組最多保留10行。這樣做可以保證原始表的增長速度,因爲我不需要該模塊的舊記錄。 –

相關問題