Суммируйте общее значение определенного поля в таблице MySQL, используя PHP и извлекая всю строку в виде массива - PullRequest
0 голосов
/ 04 августа 2009

У меня есть цикл foreach, который уже извлекает все строки из таблицы базы данных MySQL, используя запрос стиля объекта базы данных в функции. Эта функция захватывает все поля и устанавливает их в массиве ex foreach ($ blahs as $ blah => $ blah_data) Это теперь позволяет мне заполнять страницу полями для каждой строки, которая встречается. Так что это работает.

Тем не менее, мне также нужно идти дальше, и теперь я получаю эти строки на основе идентификатора отношения (например, идентификатора пользователя) и диапазона дат для каждого вхождения, а вместе с этим суммируем некоторые конкретные поля, такие как 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. Или «4» для пользователя 2. Мне нужно, чтобы строки пользователя 1 часов_работали до 16, а у пользователя 2 строк часов_работы до 28. 28. 1007 *

Как мне поступить в цикле foreach, который уже запущен для получения этих данных?

Или я все делаю неправильно?

Я забыл упомянуть, что вывод форматируется в сетку данных для распечатки ежемесячного отчета. Но также и то, что около 80% этого кода является унаследованным кодом злодеяний из места, которое хуже ада. Поэтому, потому что они не хотят это менять, я должен обойти все это, и мне понадобится целая вечность, чтобы действительно детализировать сценарий здесь.

В любом случае, здесь приведен фрагмент кода, который дает общее представление о том, что я пытаюсь сделать. Главное, на что следует обратить внимание, это то, что входящие данные уже разбиты и присвоены переменным с тем же именем, что и входящие поля. $ User_id - это 'user_id', а $ create_date - 'create_date'

Я сталкиваюсь с двумя проблемами: 1 он не работает, кажется, пока внешний foreach не запустится хотя бы один раз, поэтому в первой строке пропущены некоторые данные, которые обычно поступают из того, что, как мы надеемся, составило бы суммарные часы, отработанные для пример. И, во-вторых, кажется, что загружается только первая строка каждого вхождения, поэтому я получаю только первое значение '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;      

    }
?>

1 Ответ

1 голос
/ 04 августа 2009

Я сильно подозреваю, что вы можете решить эту проблему только с помощью вашего запроса. Я не знаю ваших точных названий таблиц / столбцов, поэтому собираюсь нанести удар.

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
...