所以我的数据库设置非常简单。
我有一个forum_cat
表(论坛类别)和forum_post
表。
forum_post
有一个字段fk_forum_cat_id
,可将每个论坛帖子与某个类别相关联。
每个forum_post
也有一个字段fk_parent_forum_post_id
,基本上说它属于原始帖子。
此外,forum_post中有date_added
和date_edited
字段。
现在,我正在尝试为论坛生成首页。我想显示一个论坛类别列表。每个类别都应有一个帖子计数和最新帖子。有人可以用一个查询来指导我一个方向。我不想运行20个单独的查询!
答案 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;
当您创建首页时,您的查询会变得更加简单和高效。