Несколько счетчиков 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 шт):
Как минимум так:
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"