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
中只保留帖子数量对这部分没有帮助。如果这样做,我认为您还应该保留lastpost\u id
,查询会简单/快速得多。这取决于论坛的大小,但我相信猫的数量应该保持合理,查询将很快执行。Chris Henry建议(添加最后一个post_id
)可以通过使用删除和插入触发器以及维护查询来实现,以便在(而不是如果)出现错误且值不正确时更正值。好的一点+1!我在寻找类似的东西,但无法想象。orderbydate…Limit 1
将愉快地替代我的子查询,可能更快,而且不依赖于自动递增的id。