php - 通过多次 foreach 循环计算用户积分的有效方法是什么?

标签 php mysql zend-framework

我需要根据用户发布的文章的一些因素来计算用户的积分。这是一个每小时运行一次的 cron 作业。

目前,我是这样做的:

  1. 获取至少发布了 1 篇文章的用户列表(以缩小列表范围)
  2. 对于每个用户,从数据库中选择他/她的文章(foreach 循环)并进行计算。然后将他/她的点更新到数据库。

基本上,就像:

$userList = getList();

foreach ($userList as $user)
{
    $articleList = getArticles($user);
    $point = 0;
    foreach ($articleList as $article)
    {
        // Do calculation here
    }
    updateUserPoint($point);
}

这可以正常工作。但是,当您遇到大型数据库(> 10k 用户和 > 100k 文章)时,此脚本运行速度越来越慢,因为列表越来越长并且这些循环需要更长的时间。 MySQL查询的数量也迅速增加。

请帮我一个好方法来做到这一点。我认为我的效率不够高,也不够好。

非常感谢。

最佳答案

需要更改 getArticles 函数中的代码,并且查询应同时使用 sum 和 group by user_id 来获取该特定用户的积分总和,然后需要在函数 updateUserPoint 函数中使用该用户 ID 更新积分。

如果您向我提供完整的 getArticals 函数,我将更改它以获取该特定用户的积分总和,然后您可以使用它来更新。

关于php - 通过多次 foreach 循环计算用户积分的有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31345070/

相关文章:

php - 将新字段添加到 Elasticsearch 中的现有索引中

php - 递归函数·

mysql - 用。。。来代替 &

php - Zend Framework - 重定向到不同模块中的 IndexController

zend-framework - 清除Zend缓存的模式

php - Zend_Form 单选元素

PHP计算——为什么1+1=3?

php - 在 http 链接上上传 xml 文件时 curl 出现 `PUT` 错误

mysql - 使用 Join 和 Group By 计算行数 - mysql 、 knex

php - mysql报告连接表和数据库结构问题