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

抱歉,如果您发现任何错误...我尝试将此查询缩减为仅相关部分,我可能在此过程中的某个地方犯了错误

所以基本上,我们这里有一个论坛帖子表和一个对这些帖子的评论回复表。每个论坛帖子可以有多个回复。第一个join用于统计回复总数,第二个join用于获取最新回复的信息。我从这个查询中得到的是这样的:

示例嵌套查询结果

所以,我基本上是想弄清楚如何在不必求助于这个嵌套查询的情况下做到这一点。你们可以提供的任何帮助都将非常有用。

谢谢!

编辑:我已经稍微调整了查询​​,以反映我不仅需要撤回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 回答