2011-10-07 5 views
-1

필요한 결과를 얻을 수 있지만 빠른 쿼리가 필요합니다.빠른 MySQL 쿼리를 사용하여 그룹의 마지막 값과 이전 값 찾기

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 

어떤 아이디어 :

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 

여기에 내가 필요로하는 결과는?


편집 : 나는 잊었다 여기 내 쿼리를 쓴 내 쿼리입니다합니다 :

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 문에서 둘 이상의 열이 있지만 문제가되지 않습니다.)

원래 쿼리 ~ 0.04seconds 걸립니다. 만약 where 문에서 다른 두 개의 열로 결과를 필터링하면 ~ 0.001 초가 걸립니다.

+0

시스템을 – JellyBelly

+3

이 질문을 추측 할 수있는 Mensa 퍼즐입니다. –

+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

안녕하세요 Lamak, 답변 해 주셔서 감사합니다. 귀하의 제안에 비슷한 쿼리를 사용하지만 빠른 기술이 있는지 알고 싶습니다. –

+0

테이블 복제가 끝납니다. 그룹당 최대 10 개의 행을 초과 할 때 삭제합니다. 그 모듈에 대한 오래된 레코드가 필요 없기 때문에 원본 테이블이 커질 때 속도를 보장합니다. –

관련 문제