Как подсчитать общее время для каждого пользователя в цикле while PHP

#php #mysql #loops #while-loop #sum

#php #mysql #циклы #цикл while #сумма

Вопрос:

У меня есть эта таблица (например)

     id      userId     totalHours      isOt
    1       1          0830            1
    2       4          0630            0
    3       1          0730            0
    4       2          0900            1
  

Мне нужно найти общее количество часов для каждого пользователя, но они должны быть показаны один раз для каждого пользователя (группа по)

И затем, если общее количество часов было присвоено как OT (с течением времени == 1), разница между общим количеством часов минус 0800часов также должна быть суммирована и показана в другом столбце.

Я пытался объединить эту таблицу с user table, но цикл кажется настолько неправильным, что в итоге все последние значения в каждом цикле суммируются с другими.

Надеюсь, найдется кто-нибудь, кто может помочь, и мы ценим вашу помощь

Комментарии:

1. Можете ли вы показать код того, что вы пробовали, чтобы люди могли помочь вам найти то, что было неправильным?

Ответ №1:

Сделайте это в своем запросе к базе данных, а не в PHP:

 SELECT UserId,
       SUM(totalHours) AS totalTime,
       SUM(IF(isOt, totalhours-800, 0)) AS totalOt
FROM yourTable
GROUP BY UserId
  

Комментарии:

1. Привет, Бармар, как я могу опубликовать таблицу внутри этого вопроса, я не знаю, как опубликовать здесь код.

2. Вставьте предварительно отформатированный текст, затем используйте {} инструмент разметки кода.

3. Привет, Бармар, я внес исправление. И после попытки выполнения вашего предложенного запроса, некоторая строка, у которой общее количество часов меньше 0800, возвращает отрицательное значение (произошло вычитание)

4. Если вы не хотите допускать отрицательные значения, используйте GREATEST(0, totalHours-800) .

5. Кстати, являются ли эти времена обычными числами, которые можно добавлять и вычитать, или они HHMM ? Вам нужно преобразовать их в обычные числа, чтобы использовать с ними обычную арифметику.