• Как сделать кеширование браузером статики на NGINX + YII2?

    @Angel1 Автор вопроса
    Вот правило в котором нужно вписать кеширование для статики, но как это сделать я хз.
    location /frontend/web/ {
                    if (!-e $request_filename){
                            rewrite ^(.*)$ /frontend/web/index.php;
                    }
            }
    Ответ написан
  • Как составить сложный SQL запрос?

    @Angel1 Автор вопроса
    Готово, запрос не очень приятный, но работает. Далее 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?
    Ответ написан
    Комментировать
  • Как правильно сформулировать SQL запрос?

    @Angel1 Автор вопроса
    Нет, Вы меня не правильно поняли.
    В created_at хранится timestamp, за сутки сутки собирается более тысячи записей. Получается, что просто вывести записи с limit 5 и order by created_at не подходит, ибо вернёт 5 последних записей за 25 минут, а мне нужно за 5 дней при том что значение count для каждого дня должно быть по самой последней записи этого дня.
    Ответ написан