2012-03-11 1 views
2

select field1, max(updated_date) from mytable을 사용 중입니다.
가장 큰 날짜 인 max(updated_date)에 올바른 값이 표시됩니다.
field1에 대해서는 세 번째 레코드 (최대 날짜 값이있는 "ta3"값)에서 실제로 "ta1"값을 원할 때 첫 번째 레코드의 값 즉, "ta1"을 얻습니다.MAX (updated_date)를 선택하면 다른 열의 값이 잘못됨

+------------+---------------------+ 
| field1  | update_date   | 
+------------+---------------------+ 
| ta1  | 2012-03-11 11:05:15 | 
| ta2  | 2012-03-11 11:05:32 | 
| ta3  | 2012-03-11 11:05:56 | 
+------------+---------------------+ 
3 rows in set (0.00 sec) 

+------------+---------------------+ 
| field1  | max(update_date) | 
+------------+---------------------+ 
| ta1  | 2012-03-11 11:05:56 | 
+------------+---------------------+ 
1 row in set (0.00 sec) 
+1

올바른 값이 무엇을? –

+1

ta3이어야합니다. – junky

+0

전체 SQL 쿼리를 게시 할 수 있습니까? –

답변

5

GROUP BY 절이나 복잡한 쿼리가 필요합니다.

SELECT field1, MAX(updated_date) 
    FROM mytable 
GROUP BY field1 

샘플 데이터의 경우 3 행을 반환합니다.

가능성이 원하는 : 샘플 데이터의 경우

SELECT t1.field1, t3.max_date 
    FROM mytable AS t1 
    JOIN (SELECT MAX(t2.updated_date) AS max_date 
      FROM mytable AS t2 
     ) AS t3 
    ON t1.updated_date = t3.max_date; 

이 1 개 행 반환합니다 주요 DBMS의

ta3 2012-03-11 11:05:56 

을 만 MySQL은 당신이 GROUP BY 절을 생략 할 allows 선택 목록에 집계와 비 집계 열이 혼합되어있을 때. SQL 표준에는 GROUP BY 절이 필요하며이 경우 집계되지 않은 모든 열을 나열해야합니다. 때로는 MySQL에서 GROUP BY 절을 생략하면 원하는 대답을 얻을 수 있습니다. 자주는 아니지만, 예기치 못한 대답을 줄 수 있습니다.

+0

사실, PostgreSQL 9.1 (또는 그 이상)에서는 GROUP BY 절에 나열된 기본 키 열 (들)이 해당 테이블의 모든 열을 포함합니다. SELECT 목록에 사용 된 모든 열의 철자를 더 이상 지정할 필요가 없습니다. (물론 이들을 집계 할 수는 없습니다.) –

+0

그래서 PostgreSQL은 좋은 키를 알고 있지만, 여전히 PK가 GROUP BY 절에 나열되어야합니다 ...그래서 MySQL 만 있으면 GROUP BY 절을 생략 할 수 있습니다. PostgreSQL의 확장 기능이 마음에 들었습니다. 나는 아직 MySQL에 확신을 갖지 못했다. –

+0

전적으로 동의합니다. PostgreSQL 기능은 구문상의 편의를 제공합니다. MySQL의 "기능"은로드 된 발걸음입니다. –

3

ORDER BY 및 LIMIT을 사용하십시오. 나에게 하나를주고, 각 행에 대해
:

SELECT t1.field1, t1.updated_date 
    FROM mytable t1 
     LEFT JOIN mytable t2 
    AND t2.updated_date > t1.updated_date 
    WHERE t2.field1 IS NULL; 

짧은 설명 :

SELECT field1, updated_date 
    FROM mytable 
ORDER BY updated_date DESC 
    LIMIT 1; 

쿼리가 많은이 대안을 시도 할 수 있습니다 필요한 경우로
그 다음은 간단합니다 최신 updated_date 행이 있습니다.
그러나 (WHERE 절) 더 이상 최신이없는 행만 사용하십시오 updated_date.
기술을 때때로 자체 제외 결합이라고합니다.
이 (WHERE 절없이, 그리고 t2.*을 추가하는 목록 SELECT하는) 중간 결과입니다

 
ta1 2012-03-11 11:05:15 ta2  2012-03-11 11:05:32 
ta1 2012-03-11 11:05:15 ta3  2012-03-11 11:05:56 
ta2 2012-03-11 11:05:32 ta3  2012-03-11 11:05:56 
ta3 2012-03-11 11:05:56 null null 
+0

이것은 간단하고 잘 작동하는 것 같습니다. – cawecoy

관련 문제