Несколько счетчиков js + php + mysql

Прошу помочь найти лучший вариант. Делаю сервис для подсчета времени работы оборудования. Выглядит это так: регистрируется пользователь, в личном кабинете создает запись с оборудованием (название, серийный номер, размещение) В зависимости от размещения каждому оборудования устанавливается коэффициент и уровень. Далее администратор сервиса, включает или выключает время работы оборудования (счетчик). Такого оборудования у пользователя может быть несколько, соответственно у каждого оборудования свой счетчик. Так вот необходимо вести статистику (подсчитать сколько оборудование заработало денег пользователю) по работе оборудования, по каждому оборудования раздельно и суммарно. Формула начисления денег за оборудование следующая:
PT - коэффициент
L - уровень оборудования
86400 - количество секунд в сутках
(PT + L) / 86400 * на количество проработанного времени в секундах = денег заработало оборудование в сутки.
В базе данных я храню пользователя, оборудование этого пользователя, счетчик каждого оборудования. Сейчас запрос запрос выглядит так:

SELECT IFNULL((SELECT SUM((`pt` + `level`) / 86400 * TIMESTAMPDIFF(SECOND, `start_date`, `end_date`))
               FROM `counter`
               INNER JOIN `equipment` ON `equipment`.`id` = `counter`.`id_equipment`
               WHERE `counter`.`switch` = "off" 
                 AND `equipment`.`id_user` = "2"), 0)
       +
       IFNULL((SELECT SUM((`pt` + `level`) / 86400 * TIMESTAMPDIFF(SECOND, `start_date`, NOW()))
               FROM `counter`
               INNER JOIN `equipment` ON `equipment`.`id` = `counter`.`id_equipment`
               WHERE `counter`.`switch` = "on" 
                 AND `equipment`.`id_user` = "2"), 0) as `current`,
       SUM(equipment.price + `level`.rate) as `day`,
       SUM(equipment.price + `level`.rate) * 30 as `month`,
       SUM(equipment.price + `level`.rate) * 365 as `year`
FROM `equipment`
INNER JOIN `level` ON `level`.`id` = `equipment`.id_level
WHERE `equipment`.`id_user` = "2"

Как это работает сейчас: время работы оборудования вычисляется разницей между временем, когда его включили и, когда выключили. Так же на каком-то оборудовании счетчик может быть выключен, а на каком-то включен, тогда время работы вычисляется так - разница между, когда включили и функцией NOW(). Таким образом суммируются все счетчики, и включенные и выключенные. Есть ли более элегантное решение. Все это работает на JS + PHP + MYSQL. Кнопка на клиенте, отправляет id оборудования в php, php записывает время включения и состояние кнопки ON.


Ответы (1 шт):

Автор решения: Slava Rozhnev

Как минимум так:

SELECT IFNULL(
        SUM(
          (`pt` + `level`) / 86400 * TIMESTAMPDIFF(
            SECOND, 
            `start_date`, 
            IF(`counter`.`switch` = "on",  NOW(), `end_date`)
          )
        ),
        0
    ) as `current`,
    SUM(equipment.price + `level`.rate) as `day`,
    SUM(equipment.price + `level`.rate) * 30 as `month`,
    SUM(equipment.price + `level`.rate) * 365 as `year`
FROM `equipment`
INNER JOIN `level` ON `level`.`id` = `equipment`.id_level
LEFT JOIN `counter` ON `equipment`.`id` = `counter`.`id_equipment`
WHERE `equipment`.`id_user` = "2"
→ Ссылка