2012-08-02 3 views
9

ID, 제목, 타임 스탬프 및 category_id 열 이름을 가진 MySQL 데이터베이스 (블로그)가 있습니다. 최신 타임 스탬프가있는 각 카테고리에서 하나의 행을 어떻게 선택할 수 있습니까? 3 행이 카테고리 1, 2, 1에 있으면 "1"카테고리의 가장 높은 타임 스탬프가 첫 번째 열이고 카테고리 2 열이 두 번째 행인 두 개의 행이 반환됩니다.각 카테고리에서 가장 큰 타임 스탬프가있는 행 선택

는 I 시도 :

SELECT title, timestamp, category_id 
FROM blogs 
WHERE timestamp IN (
    SELECT MAX(timestamp) 
    FROM blogs 
    GROUP BY category_id 
) 

BUT 소인 고유 아니므있을 가령 CATEGORY_ID 선택된 CATEGORY_ID = 2 행과 동일한 타임 스탬프를 갖는다 = 1 여분 행 당겨 inner select 문에서.

답변

9

는 MySQL의 경우,이 쿼리는 사용자가 지정한 결과 집합을 반환합니다

SELECT b.title 
    , MAX(b.timestamp) 
    , b.category_id 
    FROM blogs b 
GROUP BY b.category_id 

, 같은 최신 "타임 스탬프를"이 범주에 하나 이상의 "제목을"있을 일 경우 행이 반환되므로 각 카테고리에 대해 하나의 '제목'이 반환됩니다.


참고 : 다른 DBMS 시스템 때문에 GROUP BY에 나타나지 않는 SELECT리스트에서 비 집계의 처리, 위와 같은 쿼리와 예외 (오류)가 발생합니다.

검색어가 매우 근접했습니다. 이미 각 카테고리에 대한 "최신"타임 스탬프를 반환하는 내부 쿼리가 있습니다. 다음 단계는 해당 최신 시간 소인과 함께 category_id를 리턴하는 것입니다.

SELECT category_id, MAX(timestamp) AS timestamp 
    FROM blogs 
GROUP BY category_id 

다음 단계는 관련 "제목"을 얻기 위해, blogs 해당 다시 가입하는 것입니다 (들)

SELECT b.title 
    , b.timestamp 
    , b.category_id 
    FROM (SELECT category_id, MAX(timestamp) AS timestamp 
      FROM blogs 
     GROUP BY category_id 
     ) l 
    JOIN blogs b 
    ON b.category_id = l.category_id AND b.timestamp = l.timestamp 

참고 : 하나 이상의 "최신"행은 범주가있는 경우 (시간 소인 값이 일치 함)이 조회는 둘 다 리턴합니다.

문제가되는 경우 범주에 대해 두 행의 가능성을 방지하기 위해 쿼리를 수정하거나 다른 방법으로 작성할 수 있습니다.


는 간단히 (MySQL은 만하지 다른 DBMS를에) 작동 할 수 쿼리에 GROUP BY 절을 추가

SELECT b.title 
    , b.timestamp 
    , b.category_id 
    FROM (SELECT category_id, MAX(timestamp) AS timestamp 
      FROM blogs 
     GROUP BY category_id 
     ) l 
    JOIN blogs b 
    ON b.category_id = l.category_id AND b.timestamp = l.timestamp 
GROUP BY b.timestamp, b.category_id 

(다른 DBMS를 들어, MAX(b.title) AS title으로 b.title 교체, SELECT 목록을 수정할 수 있습니다 당신이 행에서 단일 열을 반환하는 경우. 그것은 작동합니다. 당신이 특정 순서로 반환 된 행을 원하는 경우

가, ORDER BY 절을 추가합니다.


+0

첫 번째 오류가 발생합니다. 사용자의 설명이 훌륭하게 들리지만 SQL은 오류가 발생합니다. "조인"은 "보낸 사람"으로 생각됩니까? –

+0

@ Adam : 예, FROM이되어야합니다. (나쁘지 만 고칠 것입니다.) 그 이후의 쿼리는 GROUP BY에 나타나지 않는 SELECT 목록의 비 집계를 처리하기 때문에 처음에는 MySQL과 관련된 여러 데이터베이스에서 작동하도록 설계되었습니다. 절. – spencer7593

+0

첫 번째 쿼리를 살펴볼 때 제대로 작동해야합니다. 하지만 MAX()는 최대 타임 스탬프 값을 가져 오지만 행은 여전히 ​​기본 순서로 반환됩니다. EX : 마지막 행 수가 3 인 행이 6 개있는 경우 첫 번째 쿼리는 ID 값 1,2,3 및 3이므로 첫 번째 쿼리는 첫 번째 세 행에 최대 timestamp 값을 반환합니다. 1과 4가 같은 cat_id 2 & 5 do와 3 & 6 do라고 가정하면 먼저 return이됩니다. –

0

이 방법을 시도해 볼 수도 있습니다. MYSQL 5.6에서 시험해 보았습니다. category_id의 타임 스탬프와 오름차순이 가장 높은 두 개의 범주를 반환합니다.

SELECT 표제 소인 블로그 FROM CATEGORY_ID WHERE에서 소인 CATEGORY_ID 오름차순 의해 소인 CATEGORY_ID 순서로 그룹 (블로그 CATEGORY_ID 의해 그룹에서 최대 (타임 스탬프)를 선택);

관련 문제