объединить запросы для быстрого ответа - PullRequest
0 голосов
/ 27 сентября 2018

Мне нужно показать состояние системы конечному пользователю: поэтому у меня есть набор запросов, которые показывают отправленные данные с интервалом в 1 мин, 5 мин, час, день, месяц

$sentCount = new stdClass();
$sentCount->amon = $link->query("select * from row_sent where result='succes' and TIMESTAMPDIFF(SECOND, send_date , now()) < 2073600 ;")->num_rows;
$sentCount->amin = $link->query("select * from row_sent where result='succes' and TIMESTAMPDIFF(SECOND, send_date , now()) < 60 ;")->num_rows;
$sentCount->a5min = $link->query("select * from row_sent where result='succes' and TIMESTAMPDIFF(SECOND, send_date , now()) < 300 ;")->num_rows;
$sentCount->ahour = $link->query("select * from row_sent where result='succes' and TIMESTAMPDIFF(SECOND, send_date , now()) < 3600 ;")->num_rows;
$sentCount->aday = $link->query("select * from row_sent where result='succes' and TIMESTAMPDIFF(SECOND, send_date , now()) < 86400 ;")->num_rows;

, но этот стиль коданужно много времени, чтобы извинить, как я могу изменить его, чтобы получить быстрый ответ!?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Сначала вы можете объединиться в один запрос и использовать IF и SUM для получения результата.

SELECT
    *,
    SUM(IF(TIMESTAMPDIFF(SECOND, send_date, NOW()) < 2073600,1,0)) AS MONTH,
    SUM(IF(TIMESTAMPDIFF(SECOND, send_date, NOW()) < 60,1,0)) AS one_min,
    SUM(IF(TIMESTAMPDIFF(SECOND, send_date, NOW()) < 300,1,0)) AS five_min,
    SUM(IF(TIMESTAMPDIFF(SECOND, send_date, NOW()) < 3600,1,0)) AS HOUR,
    SUM(IF(TIMESTAMPDIFF(SECOND, send_date, NOW()) < 86400,1,0)) AS DAY
    FROM
        row_sent
    WHERE
        result = 'succes';
0 голосов
/ 27 сентября 2018

Кажется, вам нужно только количество строк.Проблемы с вашим текущим кодом следующие:

  • Если вы просто хотите получить количество строк, вы должны использовать встроенную функцию COUNT () .Это будет намного быстрее.
  • Во-вторых, ваш пакет данных с сервера базы данных на код приложения теперь становится намного меньше.Вы не выбираете все данные строки, вместо этого приходит только число.
  • Также прочитайте Почему SELECT * считается вредным?

Попробуйтеследующий запрос:

$sentCount = new stdClass();
$sentCount->amon = $link->query("select COUNT(*) as count from row_sent where result='succes' and TIMESTAMPDIFF(SECOND, send_date , now()) < 2073600 ;")->row['count'];
$sentCount->amin = $link->query("select COUNT(*) as count from row_sent where result='succes' and TIMESTAMPDIFF(SECOND, send_date , now()) < 60 ;")->row['count'];
$sentCount->a5min = $link->query("select COUNT(*) as count from row_sent where result='succes' and TIMESTAMPDIFF(SECOND, send_date , now()) < 300 ;")->row['count'];
$sentCount->ahour = $link->query("select COUNT(*) as count from row_sent where result='succes' and TIMESTAMPDIFF(SECOND, send_date , now()) < 3600 ;")->row['count'];
$sentCount->aday = $link->query("select COUNT(*) as count from row_sent where result='succes' and TIMESTAMPDIFF(SECOND, send_date , now()) < 86400 ;")->row['count'];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...