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

0

У меня есть цикл foreach, который уже вытягивает все строки из таблицы MySQL db, используя запрос типа объекта db в функции. Эта функция захватывает все поля и настраивает их в массиве ex foreach ($ blahs как $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.

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

Или я все об этом ошибаюсь?

Я забыл упомянуть, что вывод форматируется в datagrid для распечатки ежемесячного отчета. Но также, что около 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;      

    }
?>
  • 0
    Возможно, вы захотите немного оптимизировать свой SQL-запрос. Если бы вы могли предоставить немного больше информации о вашей схеме БД, кто-то мог бы показать вам, как использовать LEFT JOIN и некоторую информацию SUM (), чтобы сделать вашу жизнь проще. SQL-запрос может, вероятно, получить данные из БД так, как вы этого хотите.
Теги:
arrays
multidimensional-array
nested-loops

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
  • 0
    Да, я действительно хотел, чтобы мне не пришлось это делать. У меня уже есть запрос, похожий на этот, но мне нужен список всех людей, которые имеют тип статуса ceartain (первый foreach), но все равно отображаются, даже если они не находятся в диапазоне данных, поэтому я подумал, что необходимо выполнить другой запрос, который затем передает диапазон дат и идентификатор пользователя, чтобы отфильтровать остальные и заполнить оставшиеся поля на сайте данными, которые представляют собой сумму конкретных полей, соответствующих диапазону дат и user_id. Имеет ли это смысл? Отчасти это потому, что это сбивает с толку в целом. Спасибо за вашу информацию.
  • 0
    другими словами, foreach 1 получает большинство статических данных для перечисления людей. Предполагается, что второй foreach внутри него получает по user_id и в пределах диапазона дат их соответствующие строки, а затем суммирует некоторые поля для вывода.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню