0

我有一个 foreach 循环,它已经使用函数中的 db 对象样式查询从 MySQL db 表中提取所有行。该函数抓取所有字段并将其设置在一个数组 ex foreach ($blahs as $blah => $blah_data) 现在允许我使用出现的每一行的字段填充页面。所以这是有效的。

但是,我还需要更进一步,现在根据关系 id(例如用户 id)和每次出现的日期范围来获取这些行,然后总计一些特定字段,例如 hours_worked。我正在考虑在该 foreach 中有另一个 foreach 运行一个查询,该查询将日期范围变量和 user_id 传递给不同的函数。

现在发生的情况是,它只是提取了第一次出现的行及其 hours_worked 字段并将其作为总数输出。如何让 php 根据 user_id 循环遍历单个用户的行,并汇总特定字段以输出?

例如 user_id 1 有 4 行数据,每个行数组的值是 1,4,9,2(每行的小时数) user_id 2 有 8 行数据,每个行数组的值是 4,2,4,4 ,1,1,4,8。而不仅仅是为用户 1 显示“1”。或者为用户 2 显示“4”。我需要用户 1 的 hours_worked 行总计 16,用户 2 的 hours_worked 行总计 28。

为了获取这些数据,我该如何在已经运行的 foreach 循环中解决这个问题?

还是我做错了?

我确实忘记提及输出正在格式化为数据网格以打印月度报告。但其中大约 80% 是来自比地狱更糟糕的地方的遗留暴行代码。所以,因为他们不想改变这一点,所以我必须解决所有这些问题,而且我要花很长时间才能真正详细说明这里的场景。

无论如何,这里是一些代码的片段,可以大致了解我正在尝试做什么。需要注意的主要事项是传入的数据已经分解并分配给与传入字段同名的变量。$user_id 是 'user_id' 而 $created_date 是 'created_date'

我遇到了两个问题,1 它似乎直到外部 foreach 至少运行一次才运行,所以第一行错过了一些通常来自希望总工作时间的数据。2,它似乎只加载每次出现的第一行,所以我只得到'hours_worked'的第一个值而不是总和。

$users = Users::getAllUsers();

foreach ($users as $user => $find_user)
{       
    $user_data = $find_user['user_obj']; //this is so all users can be listed on the datagrid at all times rather than only show up if date range/user_id matches. I have the query function assigning variables to the array items. (ex. $name prints the name at this point if I call it in the html table)

    $tech_data = Maintenance::getTechDataByDateRangeAndUser($month, $year, $techs->uid ); //unlike the above that gets all, this one gets data by type "techs" in the query and then by specific user_id within a month year date range.

//all I want to do at this point is tally the 'hworked' field (pre-assigned as $hworked in the query function) for all rows occurring for each tech. 
    foreach ($tech_data as $data => $find_tech_data)
        {
        $worked_hours_total = 0;    

        $tech_occurrence = $find_tech_data['hused'];
        $tech_occurrence_hours = $tech_occurrence;
        $worked_hours_total += doubleval($tech_occurrence_hours);
        }   
        $tech_hours = $worked_hours_total;      

    }
?>
4

1 回答 1

1

我强烈怀疑您只需查询即可解决此问题。我不知道您的确切表/列名称,所以我要尝试一下。

SELECT u.*
     , SUM(h.hours_worked)
  FROM user u
  LEFT JOIN hours h
    ON u.user_id = h.user_id
 GROUP BY u.user_id

您可以更进一步,为您的日期范围添加 where 子句。以六月为例

SELECT u.*
     , SUM(h.hours_worked)
  FROM user u
  LEFT JOIN hours h
    ON u.user_id = h.user_id
 WHERE ( DATE(h.date) >= '2009/06/01' AND DATE(h.date) < '2009/07/01' )
 GROUP BY u.user_id
于 2009-08-04T19:53:06.243 回答