SQL 쿼리 질문 : X는 많은 Y가 있습니다. 모든 X를 얻고 X 당 최신 Y 만 얻습니다.

StackOverflow https://stackoverflow.com/questions/804397

  •  03-07-2019
  •  | 
  •  

문제

두 개의 테이블이 있다고 가정 해 봅시다. 게시 및 의견. 게시물에는 많은 의견이 있습니다. 게시물 당 댓글 수가 다양하도록 다소 채워진 척합니다. 나는 모든 게시물을 가져 오는 쿼리를 원하지만 게시물 당 최신 주석 만 가져옵니다.

나는 조인 및 하위 쿼리로 지시되었지만 알아낼 수는 없습니다.

예제 출력 :

Post1 : Comment4 (Post1의 최신)

Post2 : Comment2 (Post2의 최신)

Post3 : 댓글 10 (Post3의 최신)

등...

모든 도움은 대단히 감사하겠습니다. 감사.

도움이 되었습니까?

해결책

이 답변은 각 의견에 대해 고유 한 식별자가 있고 증가하는 숫자라고 가정합니다. 즉, 나중에 게시물은 이전 게시물보다 숫자가 더 높습니다. 순차적 일 필요는 없으며 입력 순서에 해당해야합니다.

먼저 Post ID로 그룹화 된 최대 주석 ID를 추출하는 쿼리를 수행하십시오.

이 같은:

SELECT MAX(ID) MaxCommentID, PostID
FROM Comments
GROUP BY PostID

이것은 당신에게 Post ID 목록과 각각의 가장 높은 (최신) 주석 ID 목록을 제공합니다.

그런 다음이와 함께 댓글에서 나머지 데이터를 추출하여 해당 ID에 대해 나머지 데이터를 추출합니다.

SELECT C1.*, C2.PostID
FROM Comments AS C1
     INNER JOIN (
         SELECT MAX(ID) MaxCommentID, PostID
         FROM Comments
         GROUP BY PostID
     ) AS C2 ON C1.CommentID = C2.MaxCommentID

그런 다음 게시물에 가입하여 해당 게시물에 대한 정보를 얻으십시오.

SELECT C1.*, P.*
FROM Comments AS C1
     INNER JOIN (
         SELECT MAX(ID) MaxCommentID, PostID
         FROM Comments
         GROUP BY PostID
     ) AS C2 ON C1.CommentID = C2.MaxCommentID
     INNER JOIN Posts AS P ON C2.PostID = P.ID

대체 접근 방식은 내부 쿼리의 PostID를 전혀 사용하지 않습니다. 먼저, 모든 고유 한 게시물에 대한 최대 주석 ID를 선택하지만 어떤 게시물을 신경 쓰지 않으면, 우리는 그들이 고유 한 것을 알고 있습니다.

SELECT MAX(ID) AS MaxCommentID
FROM Comments
GROUP BY PostID

그런 다음 해당 주석에 대한 나머지 데이터를 얻으려면 절을 수행하십시오.

SELECT C1.*
FROM Comments
WHERE C1.ID IN (
    SELECT MAX(ID) AS MaxCommentID
    FROM Comments
    GROUP BY PostID
)

그런 다음 게시물에 참여하기 만하면됩니다.

SELECT C1.*, P.*
FROM Comments AS C1
     INNER JOIN Posts AS P ON C1.PostID = P.ID
WHERE C1.ID IN (
    SELECT MAX(ID) AS MaxCommentID
    FROM Comments
    GROUP BY PostID
)

다른 팁

하위 퀘스트에서 최신 주석을 선택하십시오

예를 들어

Select * 
from Posts po
Inner Join
(
Select CommentThread, CommentDate, CommentBody, Post from comments a
inner join 
(select commentthread, max(commentdate)
from comments b
group by commentthread)
on a.commentthread = b.commentthread
and a.commentdate = b.commentdate
) co
on po.Post = co.post
 select *
   from post
      , comments
  where post.post_id = comments.post_id
    and comments.comments_id = (select max(z.comments_id) from comments z where z.post_id = post.post_id)

그리고 여전히 오래된 MySQL 버전에 갇혀 있어야한다면, 하위 쿼리를 알지 못하는 것과 같은 것을 사용할 수 있습니다.

SELECT
  p.id, c1.id
FROM
  posts as p
LEFT JOIN
  comments as c1
ON
  p.id = c1.postId
LEFT JOIN
  comments as c2
ON
  c1.postId = c2.postId
  AND c1.id < c2.id
WHERE
  isnull(c2.id)
ORDER BY
  p.id
어느 쪽이든, 쿼리를 확인하십시오 설명 성능 문제.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top