2013-02-04 2 views
2

나는 Posts이라는 테이블과 Comments이라는 두 번째 테이블을 가지고 있습니다. 이들은 posts 테이블의 id 열과 comments 테이블의 postid 열과 연결됩니다.MySQL이 조인 된 테이블의 그룹화 된 날짜순으로 정렬

두 테이블 모두 게시 된 날짜 인 date 열이 있습니다. 가장 최근 활동을 기준으로 내 게시물을 정렬 할 수 있기를 원하기 때문에 게시물의 날짜 (댓글이없는 경우) 또는 의 최신 댓글 댓글 날짜순으로 정렬해야합니다. 이 작업을 수행하기 위해

, 나는이 간단한 쿼리를 구성했습니다

SELECT Posts.id FROM Posts 
INNER JOIN Comments ON Posts.id = Comments.postid 
ORDER BY Comments.date ASC 

불행하게도, 이것은 매우 분명 문제가있다. 게시물에 대한 의견이 없으면 무시됩니다. 소식에 여러 개의 댓글이있는 경우 결과에 여러 번 표시됩니다.

이러한 요구 사항을 충족시키기 위해 어떻게 쿼리를 구성 할 수 있습니까?

+0

그래서에'Posts.date의 ASC'을 추가

SELECT Posts.id FROM Posts LEFT JOIN Comments ON Posts.id = Comments.postid GROUP BY Posts.id ORDER BY coalesce(max(Comments.date),Posts.date) ASC 
Kermit

답변

3

LEFT JOIN을 사용하면 JOIN이 성공한 경우에만 Posts의 모든 행과 Comments의 행을 반환합니다. comments.postid=posts.id의 설명이 없기 때문에 조인에 성공하지 못하면 Posts에서 모든 값을 가져 오지만 Comments의 값은 널입니다.

GROUP BY을 사용해야하므로 각 ID에 대해 하나의 행만 표시되며 MAX() 집계 함수를 사용하면 주석 테이블에서 최대 날짜를 얻을 수 있습니다.

댓글이 없으면 max(comments.date)은 Null이므로 COALESCE는 Posts.date을 대신 반환합니다.

그리고 마지막 질문은 이것이다 :

SELECT Posts.id 
FROM Posts left JOIN 
    Comments 
    ON Posts.id = Comments.postid 
group by posts.id 
ORDER BY coalesce(max(Comments.date), posts.date) ASC 
+0

위대한, 감사합니다, 나는 합병에 관해 알지 않았다. 'GROUP BY' 절이 왜 필요한지 간단히 설명해 주시겠습니까? 나는 그것이 실제로 어떻게 작동하는지 정말로 알지 못한다. –

1

당신은 왼쪽 외부 댓글이 없을 수 있음을 고려해야 가입 필요 너의`주문 '?
관련 문제