2013-08-14 2 views
32

를함으로써 나는 문제가있다 :GROUP MAX 날짜

SELECT * FROM tblpm n 
WHERE date_updated=(SELECT MAX(date_updated) 
FROM tblpm GROUP BY control_number 
HAVING control_number=n.control_number) 

는 기본적으로, 각 관리 번호에 대한 가장 최근의 날짜를 반환합니다. 위의 쿼리는 올바른 결과를 반환하지만 37 초가 걸립니다. 출력이 표시되기 전에.

위의 쿼리보다 빠르게 실행할 수있는 다른 sql 절이나 명령이 있습니까?

미리 감사드립니다.

SELECT * FROM tblpm n 
WHERE date_updated=(SELECT MAX(date_updated) 
    FROM tblpm WHERE control_number=n.control_number) 

을 또한, 당신은 'date_updated'컬럼에 인덱스가 있습니까 :

답변

73

하위 쿼리를 WHERE 절에 넣고 n.control_number로 제한하면 여러 번 하위 쿼리가 실행됩니다. 이를 이라는 하위 쿼리이라고하며 성능 저하 요인입니다.

컨트롤 번호 당 최대 날짜를 얻으려면 FROM 절에서 하위 쿼리를 한 번 실행하는 것이 좋습니다. HAVING와 빠르고 쉬운

SELECT n.* 
FROM tblpm n 
INNER JOIN (
    SELECT control_number, MAX(date_updated) AS date_updated 
    FROM tblpm GROUP BY control_number 
) AS max USING (control_number, date_updated); 
+0

고마워요! 이제 완벽하게 작동합니다 :-) –

+3

mysql doc -> http://dev.mysql.com/doc/refman/5.0/en/example-maximum-column-group-row.html –

+0

@PacketTracer, doc 링크에 감사드립니다. ! 그리고 [tags : n-per-group] 태그를 만들었으므로이 질문은 StackOverflow에서 900 번 이상 요청되었습니다. –

12

그 하위 쿼리 그룹에 필요 절은 충분 곳에는 ... 없다? 그것은 확실히 도움이 될 것입니다.

+0

... 좋은! 생명의 은인. :) –

+2

업데이트 된 날짜가 같으면 (넥타이)이 솔루션을 사용할 때 두 레코드를 보여주기 때문에'GROUP BY n. '을 추가해야합니다. control_number' – radtek

-3

: HAVING의 맥락에서

SELECT * FROM tblpm n 
FROM tblpm GROUP BY control_number 
HAVING date_updated=MAX(date_updated); 

MAX 각 그룹의 최대를 찾습니다. 각 그룹의 최신 항목 만 date_updated=max(date_updated)을 만족합니다. 그룹 내에서 가장 최신 동점이 있다면 둘 다 HAVING 필터를 전달하지만 GROUP BY은 반환 된 테이블에 하나만 나타납니다. 그룹화를 사용하지 않는

+0

: '선택 *에서 order_order_status 곳 order_order_status에 의해 order_order_status.order_id = 1 개 그룹. ORDER_ID order_order_status.created_at = 최대 (order_order_status.created_at)를 갖는'그 테이블 엔트리를 갖는'(ID는 ORDER_ID, created_at)이 VALUES order_order_status 삽입 반 (1, 1 '2016년 10월 1일 1시 57분 37초') (2, 2 '2016년 10월 1일 1시 57분 54초') (3, 3 '2016년 10월 2일 2시 12분 49초') (4,3 '2016-10 -02 2시 14분 19초 ') (5, 3'2016년 10월 2일 4시 18분 7초 ') (8, 1'2016년 10월 3일 1시 22분 53초 '); ' – Toskan

+0

내가 downvote 수 있으면 좋겠다,이 시간이 좀 – Toskan

+0

이 작동하지 않습니다를 잃었다! – Alexey

-1

또 다른 방법 : Toooo

SELECT * FROM tblpm n 
    WHERE date_updated=(SELECT date_updated FROM tblpm n 
         ORDER BY date_updated desc LIMIT 1) 
관련 문제