2

というテーブルとPosts、 という 2 番目のテーブルがありますComments。これらはid、投稿テーブルのpostid列とコメント テーブルの列によってリンクされています。

両方のテーブルには、date投稿された日付を示す列があります。最新のアクティビティに基づいて投稿を並べ替えられるようにしたいので、投稿の日付 (コメントがない場合) または最新のコメントの日付で並べ替える必要があります。

これを行うために、次の単純なクエリを作成しました。

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

残念ながら、これには非常に明白な問題があります。投稿にコメントがない場合、その投稿は無視されます。投稿に複数のコメントがある場合、結果に複数回表示されます。

これらの要件を満たすクエリを作成するにはどうすればよいですか?

4

2 に答える 2

3

からのすべての行と、JOIN が成功した場合にのみからLEFT JOINの行を返すを使用する必要があります。のコメントがないために結合が失敗した場合でも、 からすべての値を取得できますが、 からの値は Null になります。PostsCommentscomments.postid=posts.idPostsComments

次に を使用するGROUP BY必要があるため、ID ごとに 1 つの行のみを取得し、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
于 2013-02-04T22:48:21.053 に答える
1

コメントがない可能性があることを考慮に入れるには、左外側の結合が必要です。

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
于 2013-02-04T22:49:57.883 に答える