는 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 절을 추가합니다.
첫 번째 오류가 발생합니다. 사용자의 설명이 훌륭하게 들리지만 SQL은 오류가 발생합니다. "조인"은 "보낸 사람"으로 생각됩니까? –
@ Adam : 예, FROM이되어야합니다. (나쁘지 만 고칠 것입니다.) 그 이후의 쿼리는 GROUP BY에 나타나지 않는 SELECT 목록의 비 집계를 처리하기 때문에 처음에는 MySQL과 관련된 여러 데이터베이스에서 작동하도록 설계되었습니다. 절. – spencer7593
첫 번째 쿼리를 살펴볼 때 제대로 작동해야합니다. 하지만 MAX()는 최대 타임 스탬프 값을 가져 오지만 행은 여전히 기본 순서로 반환됩니다. EX : 마지막 행 수가 3 인 행이 6 개있는 경우 첫 번째 쿼리는 ID 값 1,2,3 및 3이므로 첫 번째 쿼리는 첫 번째 세 행에 최대 timestamp 값을 반환합니다. 1과 4가 같은 cat_id 2 & 5 do와 3 & 6 do라고 가정하면 먼저 return이됩니다. –