2011-01-09 3 views
0

예를 들어 이렇게 작성하겠습니다.SQL : 가장 최근에 교차 항목을 선택하는 방법은 무엇입니까?

테이블 호출 맵이 있습니다.

ID,TITLE,MAP,VERSION. 

이 지금은 세 개의지도를 삽입 :이 (simplyfied)이 같은 항목은
INSERT INTO maps VALUES(1,'MAP1','some blob stuff',1); 
INSERT INTO maps VALUES(2,'MAP2','some blob stuff',1); 
INSERT INTO maps VALUES(3,'MAP1','some blob stuff',2); 

지금 내가 두 번 한지도를 얻었으나, 두 개의 서로 다른 버전.

이제 어떻게 각각의 최신지도 만 선택할 수 있습니까? 그러면 MAP1 vers 2와 MAP2 vers 1 만 표시됩니까?

+0

어떤 데이터베이스를 사용하고 있습니까? SQL Server/MySQL? – Chandu

+0

MySQL을 사용하고 있습니다. 그리고 난 그저 부엉이가 작동하지 않을 것이라고 생각 GROUP By ..? 와 함께 실제로도 허용됩니다. –

답변

2
SELECT M1.* 
FROM maps M1 
WHERE M1.version = (SELECT MAX(M2.version) FROM maps M2 WHERE M2.title = M1.title) 

하지만 GROUP BY

SELECT M1.id, M1.title, M1.map, MAX(M1.version) 
FROM maps M1 
GROUP BY M1.title 

편집을 피할 필요가 왜 표시되지 않습니다 - 지적했듯이이 두 번째 쿼리는 첫

+0

반환 된지도 열 값이 MAX (버전) 인 행의 값이 아니므로 –

+0

이 질문이있는 검색어는 무엇입니까? –

+0

두 번째 것. 그룹에서 집계 값을 가져올 수는 있지만 특정 행에서 "지도"열 값 (이 쿼리의 데이터)을 가져올 수는 없습니다. 이는 정의되지 않은 행 하나에서 가져옵니다. 모든 RDBMS는 집계되지 않은 모든 열이 GROUP BY에 포함되어 있지 않으면 GROUP BY 쿼리를 허용하지 않습니다. MySQL은하지만, 집계되지 않은 컬럼에는 정의되지 않은 값을 갖습니다. –

0
으로, 적절한 ID와 맵 값을 보장 스틱 캔트
SELECT * FROM maps m1 WHERE NOT EXISTS 
    (SELECT * FROM maps m2 WHERE m2.title = m1.title AND m2.version > m1.version) 
관련 문제