创建自定义论坛,帮助构建查询类别中的帖子等的查询

时间:2010-06-24 21:10:47

标签: mysql database

所以我的数据库设置非常简单。

我有一个forum_cat表(论坛类别)和forum_post表。

forum_post有一个字段fk_forum_cat_id,可将每个论坛帖子与某个类别相关联。

每个forum_post也有一个字段fk_parent_forum_post_id,基本上说它属于原始帖子。

此外,forum_post中有date_addeddate_edited字段。

现在,我正在尝试为论坛生成首页。我想显示一个论坛类别列表。每个类别都应有一个帖子计数和最新帖子。有人可以用一个查询来指导我一个方向。我不想运行20个单独的查询!

4 个答案:

答案 0 :(得分:2)

如果我正确地阅读了您的问题,您正在寻找类别,该类别中的帖子数量以及该类别中的最新帖子。也许laurent-rpnet的答案的这种简化就可以解决问题......

SELECT c.forum_cat_id,
       COUNT(p.fk_forum_cat_id),
       MAX(p.date_added), 
      (SELECT p2.post_title
           FROM forum_post AS p2 
           WHERE p2.forum_cat_id = c.forum_cat_id
           ORDER BY date_added DESC
           LIMIT 1)
    FROM forum_cat AS c INNER JOIN 
               forum_post AS p ON p.fk_forum_cat_id = c.forum_cat_id
    GROUP BY c.forum_cat_id;

答案 1 :(得分:1)

如果forum_post主键自动递增(应该但我们永远不知道......),这将返回您所需的内容:

SELECT c.forum_cat_id, COUNT(p.fk_forum_cat_id), MAX(p.date_added), 
    (SELECT p2.post_title FROM forum_post AS p2 
        WHERE p2.forum_post_id = (SELECT MAX(p3.forum_post_id) FROM forum_post AS p3 
            WHERE p3.fk_forum_cat_id = p2.fk_forum_cat_id) AND p2.fk_forum_cat_id = c.forum_cat_id) 
FROM forum_cat AS c INNER JOIN 
    forum_post AS p ON p.fk_forum_cat_id = c.forum_cat_id
GROUP BY c.forum_cat_id;

我不得不猜测一些字段名称:

  • forum_cat_id = forum _cat主键
  • forum_post_id = forum_post主键
  • post_title =帖子标题或forum_post中帖子文字的开头(取决于您要展示的内容)。
  • COUNT(p.fk_forum_cat_id)列将包含类别
  • 中的帖子计数

除了你提出的问题,你会得到该类别中最新帖子的日期,因为如果它是一个很好的论坛,我认为你需要它。)。

Obs:我没有测试它,所以你可能需要一些调试。如果您有问题,请告诉我。

答案 2 :(得分:0)

您可以根据您的问题调整此示例:

SELECT * 
FROM  `test_post` AS p3
JOIN (

SELECT MAX( id ) AS id
FROM  `test_post` AS p1
JOIN (

SELECT MAX(  `test_post`.date ) AS DATE, cat
FROM  `test_post` 
GROUP BY cat
) AS p2 ON p1.date = p2.date
AND p1.cat = p2.cat
GROUP BY p1.cat
) AS p4 ON p3.id = p4.id;

答案 3 :(得分:0)

动态计数的查询往往会很快变慢并消耗大量的cpu。即使有良好的索引,MySQL也必须每次都做很多工作来计算所有这些行。

此类查询的替代方法是汇总forum_cat表中的帖子计数。创建一个名为posts_count的列。每次创建帖子时,都可以轻松运行查询增量或减少计数。

  

更新forum_cat SET posts_count = posts_count + 1;

当您创建首页时,您的查询会变得更加简单和高效。