Готово, запрос не очень приятный, но работает. Далее timestamp заменю на date. Запрос занял 0.0806 сек.
1. Необходимо получить 7 записей (неделя) из БД, в каждой записи должна быть дата и кол-во подписчиков
для всех аккаунтов.
SELECT
`date`,
SUM(`count`) AS `count`
FROM (
SELECT * FROM (
SELECT
DATE(FROM_UNIXTIME(`created_at`)) AS `date`,
CONCAT(`account_id`, DATE(FROM_UNIXTIME(`created_at`))) AS `a`,
`count_followers`
FROM
`account_analytics`
WHERE
`created_at` > UNIX_TIMESTAMP(DATE_SUB(CURRENT_DATE, INTERVAL 6 DAY))
ORDER BY `id` DESC
) `t1` GROUP BY `a`
) `t2`
GROUP BY `date` DESC
2. Необходимо получить 7 записей (неделя) из БД, в каждой записи должна быть дата и кол-во подписчиков
для определённого аккаунта.
SELECT
`date`,
SUM(`count`) AS `count`
FROM (
SELECT * FROM (
SELECT
DATE(FROM_UNIXTIME(`created_at`)) AS `date`,
CONCAT(`account_id`, DATE(FROM_UNIXTIME(`created_at`))) AS `a`,
`count_followers`
FROM
`account_analytics`
WHERE
`account_id` = 3 AND `created_at` > UNIX_TIMESTAMP(DATE_SUB(CURRENT_DATE, INTERVAL 6 DAY))
ORDER BY `id` DESC
) `t1` GROUP BY `a`
) `t2`
GROUP BY `date` DESC
Алгоритм такой:
1. Собираются все записи за 7 дней, колонка с датой и id аккаунта сливаются в одну строку. Все записи сортируются по убыванию
2. Затем строки группируются по колонке в которой соеденена дата и id аккаунта.
3. Результат двух действий выше группируется по дате (по убыванию)
Теперь стоит вопрос об оптимизации. Получается, что первый запрос делает выборку на ~8к записей, затем вторая и третья выборка оставляет только 7 записей.
SELECT
DATE(FROM_UNIXTIME(`created_at`)) AS `date`,
CONCAT(`account_id`, DATE(FROM_UNIXTIME(`created_at`))) AS `a`,
`count_followers`
FROM
`account_analytics`
WHERE
`account_id` = 3 AND `created_at` > UNIX_TIMESTAMP(DATE_SUB(CURRENT_DATE, INTERVAL 6 DAY))
ORDER BY `id` DESC
Я так предполагаю, что оптимизировать этот запрос нельзя, не учитывая назначение индексов и изменение типа поля created_at с int в datetime?