gpt4 book ai didi

php - MySQL/PHP : Using multiple sub-queries in a query selecing multiple results, 是个坏主意吗?

转载 作者:行者123 更新时间:2023-11-29 02:02:36 25 4
gpt4 key购买 nike

抱歉,如果标题有点……蹩脚。基本上,我正在编写一个小型论坛,并使用多个子查询来选择论坛中的线程数、帖子数和最后帖子的日期,同时抓取论坛的信息以显示在主页上!

这是我的查询,因为我不善于解释:

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

最佳答案

我会做一些不同的事情:

在我看来,所有这三个字段:threadCountpostCountlastPostDate 都是可以在单独的表中维护的字段,比如 forum_stats 仅包含 4 列:
* 论坛编号
* thread_count
* post_count
* 最后发布日期

这些列可以通过更新。 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com