0

ネストされたクエリをできるだけ多く削除するために、次のクエリを最適化しようとしています。

   SELECT fp.id, 
          fp.user_id, 
          COUNT(c.id) AS num_replies, 
          c2.created AS latest_activity_time, c2.user_id AS latest_activity_user_id
     FROM forum_posts fp
LEFT JOIN comments c ON c.object_id = fp.id
LEFT JOIN (SELECT created, user_id
             FROM comments 
         ORDER BY created DESC 
            LIMIT 1) AS c2 ON fp.id = c2.object_id
    WHERE fp.deleted != 1
 GROUP BY fp.id

エラーが見つかった場合は申し訳ありません...このクエリを関連する部分だけに絞り込んでみましたが、プロセスのどこかで間違いを犯した可能性があります

つまり、基本的に、ここにあるのは、フォーラムの投稿の表と、それらの投稿に対するコメントの返信の表です。各フォーラムの投稿には、複数の返信を含めることができます。最初の結合は応答の総数をカウントするために使用され、2番目の結合は最新の応答の情報を取得するために使用されます。このクエリから返されるのは、次のようなものです。

ネストされたクエリ結果のサンプル

したがって、私は基本的に、このネストされたクエリに頼ることなくこれを行う方法を理解しようとしています。あなたたちが提供できるどんな助けも非常に役に立ちます。

ありがとう!

編集latest_activity_time:クエリを少し調整して、、だけでなく、もプルバックする必要があるという事実を反映しましたlatest_activity_user_id。混乱させて申し訳ありません!

4

2 に答える 2

3

使用する:

   SELECT fp.id,
          fp.user_id,
          COUNT(a.id) AS num_replies,
          c.date AS latest_activity_time,
          c.user_id AS latest_activity_user_id
     FROM FORUM_POSTS fp
LEFT JOIN COMMENTS a ON a.object_id = fp.id         
LEFT JOIN (SELECT x.object_id,
                  x.date, 
                  x.user_id
             FROM COMMENTS x
             JOIN (SELECT t.object_id,
                          MAX(t.date) AS max_date
                     FROM COMMENTS t
                 GROUP BY t.object_id) y ON y.object_id = x.object_id
                                        AND y.max_date = x.date) b ON b.object_id = fp.id
    WHERE fp.deleted != 1
 GROUP BY fp.id
于 2010-11-16T01:29:34.210 に答える
0

MySQLを使用しているので、次のことを回避できるはずです。

   SELECT fp.id, 
          fp.user_id, 
          COUNT(c.id) AS num_replies, 
          c.created AS latest_activity_time, 
          c.user_id AS latest_activity_user_id
     FROM forum_posts fp
LEFT JOIN comments c ON c.object_id = fp.id
    WHERE fp.deleted != 1
 GROUP BY fp.id
 ORDER BY fp.id, c.created
于 2010-11-16T12:43:43.113 に答える