抱歉,如果标题有点……蹩脚。基本上我正在编写一个小型论坛,并使用多个子查询来选择论坛中的线程数、帖子数和最后一篇帖子的日期,同时抓取论坛的信息以显示在主页上!
这是我的问题,因为我不擅长解释事情:
SELECT `f`.*,
(SELECT COUNT(`id`)
FROM `forum_threads`
WHERE `forumId1` = `f`.`id1`
AND `forumId2` = `f`.`id2`) AS `threadCount`,
(SELECT COUNT(`id`)
FROM `forum_posts`
WHERE `forumId1` = `f`.`id1`
AND `forumId2` = `f`.`id2`) AS `postCount`,
(SELECT `date`
FROM `forum_posts`
WHERE `forumId1` = `f`.`id1`
AND `forumId2` = `f`.`id2`
ORDER BY `date` DESC LIMIT 1) AS `lastPostDate`
FROM `forum_forums` AS `f`
ORDER BY `f`.`position` ASC, `f`.`id1` ASC;
并且我使用通用的 foreach 循环来显示结果:
foreach($forums AS $forum) {
echo $forum->name .'<br />';
echo $forum->threadCount .'<br />';
echo $forum->postCount .'<br />';
echo $forum->lastPostDate .'<br />';
}
(当然不完全一样,但为了解释......)
现在我想知道这是否会对性能“不利”,或者是否有更好的方法?假设每个论坛中有相当多的帖子和主题。
我最初将“posts”、“threads”和“lastPost”列存储在论坛表本身中,并且每次有人创建新线程或帖子时都会增加(posts = posts + 1)这些值。虽然我也有这个想法,并且想知道它是否有好处。 :P
最佳答案
我会做一些不同的事情:
在我看来,所有这三个字段:threadCount
、postCount
和lastPostDate
都是可以在单独的表中维护的字段,比如forum_stats
仅包含 4 列:
* forum_id
* 线程数
* 帖子计数
* 最后发布日期
这些列可以通过更新。 trigger插入/更新时。
如果您在更新操作期间支付这么小的开销 - 您将获得对 select
的非常快速的查询(并且无论您拥有多少论坛/帖子/线程,它都将保持非常快的速度) .
另一种方法(不是我们好的TMO):
创建统计表并每天(或每隔几个小时)运行一次 batch-job这将更新统计数据。代价是您显示的数据永远不会是最新的,并且该作业可能需要资源,您可能只想在晚上运行该作业,例如,因为它很重并且您不希望它生效您网站的大多数访问者。
关于php - MySQL/PHP : Using multiple sub-queries in a query selecing multiple results, 这是一个坏主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12170846/