作成中のフォーラム アプリケーション用に 3 つのテーブルがあります。
boards
- 投稿のコレクションを表す、is_deleted
ブール値posts
- 一部のテキストとコメントのコレクションを表しますcomments
- いくつかのテキストを表します
私の目標は、削除済みとしてマークされていないボードからのすべての投稿を一定数表示し、投稿に対して行われた最後のコメント (および投稿の作成日) の順に並べることです。これを行う必要がある現在のクエリは次のとおりです。
SELECT
posts.*,
(SELECT created_date
FROM comments
WHERE comments.post_id = posts.id
ORDER BY comments.created_date DESC
LIMIT 1) as last_comment
FROM posts
JOIN boards ON boards.id = posts.board_id
WHERE boards.is_deleted = 0
ORDER BY
last_comment DESC,
posts.created_date DESC
LIMIT 4
OFFSET 0
last_comment
これは非常にうまく機能しますが、結果を並べ替えるために使用する場合以外は実際には必要ないため、ほとんど理由なく追加の SELECT を実行しているように感じます。これを行うより良い方法はありますか?
2013-05-18 を編集:
もう少しいじってみると、ネストされた SELECT ステートメントに依存しないクエリがあると思います。
SELECT
posts.*
FROM posts
JOIN boards
ON boards.id = posts.board_id
LEFT OUTER JOIN comments
ON posts.id = comments.post_id
WHERE
boards.is_deleted = 0
GROUP BY
posts.id
ORDER BY
comments.created_date DESC,
posts.created_date DESC
LIMIT 4
OFFSET 0