如何获得这个SQL查询摆脱PHP包装的(How to get rid of the php wrap

2019-10-29 03:52发布

我有两个表。 一个是生产表员额和其他是帖子的观点集合。

一旦一个小时,所有的文章观点得到组合在一起,主要生产表得到更新。 和后期的意见表被截断。

我的目标是让这个功能为纯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;
文章来源: How to get rid of the php wrapping on this sql query