Андрей
Высший разум
(425894)
6 лет назад
1. Зачем prepare / execute, если у тебя запросы вообще без параметров? В этом случае удобнее использовать query.
2. У тебя 2 запроса с идентичными WHERE. Можно объединить в один:
SELECT
COUNT(*) as count,
AVG(TIMESTAMPDIFF(MINUTE,dateadd,processed)) as avgtime
FROM
orders
WHERE
dateadd >= NOW() - INTERVAL 1 DAY AND status = ''success'
Если запросы имеют множество JOIN и выполняются слишком долго - тогда имеет смысл подумать об их разделении на несколько независимых запросов. А разделять простейшие запросы не имеет смысла - это только увеличит нагрузку на базу данных.
// узнаем сколько всего заказов за 24 часа
$result = $db->prepare("SELECT count(*) as count FROM orders WHERE dateadd >= now() - INTERVAL 1 DAY");
$result -> execute();
$row = $result->fetch();
$orders_last24hours = $row['count'];
// узнаем сколько выполненных заказов за 24 часа
$result = $db->prepare("SELECT count(*) as count FROM orders WHERE dateadd >= now() - INTERVAL 1 DAY AND status = ''success");
$result -> execute();
$row = $result->fetch();
$processed_24hours = $row['count'];
// среднее время обработки заказа
$result = $db->prepare("SELECT AVG(TIMESTAMPDIFF(MINUTE,dateadd,processed)) as avgtime FROM orders WHERE dateadd >= now() - INTERVAL 1 DAY AND status = 'success'"); //dateadd и processed имеют тип datetime
$result -> execute();
$row = $result->fetch();
$avgtimeprocess = $row['avgtime'];
if ($avgtimeprocess > 60) { // перевод в часы
$avgtimeprocess = round($avgtimeprocess / 60, 1);
}
else {
$avgtimeprocess = round($avgtimeprocess);
}