2011-10-07 22 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行。这样做可以保证原始表的增长速度,因为我不需要该模块的旧记录。 –

相关问题