Суммируйте общее значение определенного поля в таблице MySQL, используя PHP и вытягивая всю строку в виде массива.

У меня есть цикл 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. Мне нужно, чтобы строки hours_worked пользователя 1 составляли 16, а строки hours_worked пользователя 2 - 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;      

    }
?>

person Community    schedule 04.08.2009    source источник
comment
Вероятно, вы захотите немного оптимизировать свой SQL-запрос. Если бы вы могли предоставить немного больше информации о вашей схеме БД, кто-то, вероятно, мог бы показать вам, как использовать LEFT JOIN и некоторую информацию SUM(), чтобы сделать вашу жизнь проще. SQL-запрос, вероятно, может получить данные из БД так, как вы этого хотите.   -  person gnarf    schedule 04.08.2009


Ответы (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
person Peter Bailey    schedule 04.08.2009
comment
Да, я действительно хотел, чтобы мне не пришлось этого делать. У меня уже есть запрос, похожий на этот, но мне нужен как список всех людей, которые имеют определенный тип статуса (первый foreach), но все равно отображаются, даже если они не находятся в диапазоне данных, поэтому я подумал, что я бы необходимо выполнить другой запрос, который затем передает диапазон дат и идентификатор пользователя, чтобы отфильтровать остальные и заполнить оставшиеся поля на сайте данными, которые представляют собой сумму определенных полей, соответствующих диапазону дат и user_id. Имеет ли это смысл? Частично это потому, что это сбивает с толку в целом. Спасибо за информацию. - person ; 05.08.2009
comment
Другими словами, foreach 1 получает большую часть статических данных для перечисления людей. Предполагается, что второй foreach внутри него захватывает по user_id и в пределах диапазона дат связанные с ними строки, которые возникают, а затем суммирует некоторые поля для вывода. - person ; 05.08.2009
comment
Ха-ха, нет, это действительно не имеет смысла. Вы должны вернуться к своему первоначальному вопросу и вставить пример кода или что-то еще, что вы можете сделать, чтобы прояснить это. не беспокойтесь о том, чтобы задать длинный вопрос - просто дайте кучу информации. - person Peter Bailey; 05.08.2009
comment
К сожалению, таблицы, унаследованные до того, как я пришел, чрезвычайно запутаны. Мне нужно присоединиться к двум другим таблицам, чтобы заставить FK присоединиться к таблице, которая позволяет мне сопоставлять часы с идентификатором пользователя. Я собираюсь пойти дальше и попробовать метод запроса. Но в прошлый раз, когда я пытался, он не получил нужных данных. - person ; 05.08.2009