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

Mysql 创建自定义论坛,帮助构建查询,统计类别中的帖子等,mysql,database,Mysql,Database,所以我的数据库设置相当简单 我有一个forum\u cat表(一个论坛类别)和forum\u post表 forum_post有一个字段fk_forum_cat_id,它将每个论坛帖子绑定到一个类别 每个forum\u post也有一个字段fk\u parent\u forum\u post\u id,基本上说它属于原始帖子 此外,论坛帖子中还添加了一个date\u和date\u编辑的字段 现在,我正在尝试为我的论坛生成头版。我想显示一个论坛类别列表。每个类别都应该有一个帖子数量和最新的帖子。有

所以我的数据库设置相当简单

我有一个
forum\u cat
表(一个论坛类别)和
forum\u post

forum_post
有一个字段
fk_forum_cat_id
,它将每个论坛帖子绑定到一个类别

每个
forum\u post
也有一个字段
fk\u parent\u forum\u post\u id
,基本上说它属于原始帖子

此外,论坛帖子中还添加了一个
date\u和
date\u编辑的
字段


现在,我正在尝试为我的论坛生成头版。我想显示一个论坛类别列表。每个类别都应该有一个帖子数量和最新的帖子。有没有人能给我一个能同时做到这一点的问题的指导。我不想运行20个单独的查询

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

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;

如果
forum\u 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\u cat\u id
    =
    forum\u cat
    主键
  • forum\u post\u id
    =
    forum\u post
    主键
  • post\u title
    =在
    forum\u post
    中发布文章的标题或开头(取决于您想要显示的内容)
  • 计数(p.fk\u forum\u cat\u id)
    列将包含类别中的帖子计数
除了你所问的,你还将得到该类别中最新帖子的日期,因为我认为如果这是一个好论坛,你将需要它;)


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

用于动态计数的查询速度往往会很快变慢,并消耗大量cpu。即使有好的索引,MySQL每次都要做大量的工作来统计所有这些行

类似查询的另一种方法是汇总
forum\u cat
表中的帖子数量。创建一个名为
posts\u count
的列。每次创建post时,运行递增或递减计数的查询都非常简单

更新论坛帖子数量=帖子数量+1


当你去创建首页时,你的查询会变得更简单、更有效。

如果我正确地阅读了你的问题,你将查找类别、类别中的帖子数量以及该类别中的最新帖子。也许劳伦特·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;

我们如何确定最新的帖子?有日期栏吗?fk_parent_forum_post_id是一个自动递增的整数字段吗?forum_post中有一个date_posted和date_Edit字段它必须是一个查询吗?如果你把它一分为二就容易多了。。。一个用于获取cat id(或名称)、它们的计数和它们的最大发布日期,另一个用于获取实际发布如果您愿意,您可以使用
date\u edited
而不是
date\u added
!计数很慢,但是查找每个cat中的最后一个帖子对于这个查询来说是一项艰巨的任务。在
forum\u cat
中只保留帖子数量对这部分没有帮助。如果这样做,我认为您还应该保留last
post\u id
,查询会简单/快速得多。这取决于论坛的大小,但我相信猫的数量应该保持合理,查询将很快执行。Chris Henry建议(添加最后一个
post_id
)可以通过使用删除和插入触发器以及维护查询来实现,以便在(而不是如果)出现错误且值不正确时更正值。好的一点+1!我在寻找类似的东西,但无法想象。
orderbydate…Limit 1
将愉快地替代我的子查询,可能更快,而且不依赖于自动递增的id。