Выберите СУММУ "отдельно" за последние 30 дней - PullRequest
1 голос
/ 03 ноября 2019

У меня есть таблица MySQL, которая выглядит следующим образом:

------------------------------------------------
|  id       | user_id | day    | value         |
|  INT(11)  | INT(11) | INT(8) | DECIMAL(5,2)  |
------------------------------------------------

День - это (Гм) число, подобное этому: 20191012

Я хочу получить SUM(value) для Сегодня и прошлого29 дней separately (30 дней, на основе столбца дня)

Я думал о такой петле

for($i=0;$i<=30;$i++)
{
    $query = "SELECT SUM(value) FROM table WHERE day=".date('Ymd', strtotime("-{$i} days"));
}

Но как мне добиться этого более эффективно? Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 03 ноября 2019

Этот запрос будет работать для любой версии MySQL. Он создает временную таблицу чисел с номерами от 0 до 29, а затем использует ее для вычисления списка дней с сегодняшнего дня до 29 дней ранее. Затем это LEFT JOIN выводится в таблицу данных для вычисления суммы за день, с 0 суммами, когда нет данных за данный день:

SELECT  d.day, COALESCE(SUM(value), 0)
FROM (SELECT DATE_FORMAT(CURDATE() -INTERVAL n10.n * 10 + n.n DAY, '%Y%m%d') AS day
      FROM (SELECT 0 AS n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 
            UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 
            UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) n
      CROSS JOIN (SELECT 0 AS n UNION ALL SELECT 1 UNION ALL SELECT 2) n10) d
LEFT JOIN `table` t ON t.day = d.day
GROUP BY d.day

Демонстрация на dbfiddle

1 голос
/ 03 ноября 2019

Вы можете использовать Группировать по , чтобы получить его одним MySQL-запросом

SELECT day, SUM(value) FROM table GROUP BY day WHERE day >= ".date('Ymd', strtotime("-29 days"));

Это должно работать, потому что ваше поле day является числом и будет увеличиваться каждый день, так что выможно просто сравнить его с gte

Ожидаемый результат будет

---------------------------
|  day      | SUM(value)  |
|  INT(8)   |             |
---------------------------
|  20191012 |    15.25    |
---------------------------
|  20191011 |    29.13    |
---------------------------
|    ...    |      ...    |
---------------------------

J4I: Если в вашем наборе данных есть дни без значений, в выводе также отсутствует отсутствующая "строка дня"так что может быть меньше 30 строк результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...