使用快速MySQL查询查找组中的上一个和上一个值

时间:2011-10-07 15:41:56

标签: mysql sql group-by

我可以得到我需要的结果,但我需要快速查询。

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秒。

1 个答案:

答案 0 :(得分: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