0

関数でdbオブジェクトスタイルのクエリを使用して、MySQLdbテーブルからすべての行を既にプルしているforeachループがあります。この関数は、すべてのフィールドを取得し、配列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(1行あたりの時間)があります。user_id2には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'です。

私は2つの問題に直面しています。1は、外側のforeachが少なくとも1回実行されるまで実行されていないようです。そのため、最初の行には、たとえば合計作業時間から通常入力されるデータが欠落しています。そして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 句を追加できます。たとえば、6月

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 に答える