我有两个表。 一个是生产表员额和其他是帖子的观点集合。
一旦一个小时,所有的文章观点得到组合在一起,主要生产表得到更新。 和后期的意见表被截断。
我的目标是让这个功能为纯SQL,所以我可以运行它的内部数据库引擎调度事件。
SQL是我最薄弱的点,我可以把它与SELECT是一个UPDATE内工作。 但是,如果有两个更新查询,然后我需要某种变量。
这是我开始:
<?
# find new views grouped together:
$find_views = db::query("SELECT `post_id`, COUNT(*) AS `post_views` FROM `posts__views` WHERE `date_imported` IS NULL GROUP BY `post_id`;");
while ($view = db::fetch($find_views)) {
# Update the main production tables views_count column:
db::query("UPDATE `posts` SET `views_count` = views_count + {$view['post_views']} WHERE `id` = '{$view['post_id']}';");
# Update the post's views table... but why does it actually needs this update hmm..
db::query("UPDATE `posts__views` SET `date_imported` = NOW() WHERE `date_imported` IS NULL AND `post_id` = '{$view['post_id']}';");
}
# Trunkate post's views:
db::query("TRUNCATE TABLE `posts__views`;");
我意识到,我可以使代码马上进行了优化,通过移除第二次更新。 我想我也可以完全消除date_imported,因为所有的观点得到解析,然后截断。
这意味着,我可以最有可能做的UPDATE ... WHERE (SELECT ...)
唯一的问题是,我知道该怎么做UPDATE选取它,对于一个变量。 但因为我有$view['post_views']
和$view['post_id']
在相同的更新查询,然后我绝望失落。
编辑
这是不是重复到:
MySQL的:从另一个表计数更新表?
由于没有截断那里。 它的工作原理的基础上,该意见表保持原样,用到位,每次来计算旧观点。 我截断表,所以从主表中的行,没有新的观点被设置为0。
编辑2
所以,我已经远远得到这样的:
UPDATE `posts` SET `views_count` = views_count + (SELECT COUNT(`id`) AS `views` FROM `posts__views` WHERE `post_id` = `posts`.`id` GROUP BY `post_id` HAVING COUNT(`id`) > 0)
没有感谢标志着这个问题重复。 正如我无法找到任何方法来确保,那其他行,不享有不被置为0。所以肠子-SELECT应该站出来,和外UPDATE应该有WHERE子句。 在这样的理论(但这并不”不惜一切看起来优化):
UPDATE `posts` SET `views_count` = views_count + (SELECT COUNT(`id`) AS `views` FROM `posts__views` WHERE `post_id` = `posts`.`id` GROUP BY `post_id` HAVING COUNT(`id`) > 0) WHERE (SELECT COUNT(`id`) AS `views` FROM `posts__views` WHERE `post_id` = `posts`.`id` GROUP BY `post_id` HAVING COUNT(`id`) > 0) > 0;