Преобразование сложного запроса из Laravel в SQL

Я пытаюсь полностью перенести некоторую статистическую логику на SQL, чтобы значительно улучшить производительность, однако это довольно сложно, и я не уверен, как добиться этого с помощью процедур / функций в SQL - или возможно ли это вообще.

Таблица статистики выглядит так:

Преобразование сложного запроса из Laravel в SQL

Строка в таблице выглядит так:

Преобразование сложного запроса из Laravel в SQL

Это код, который я пытаюсь преобразовать. $this->stats - это красноречивый набор всех строк в таблице:

return $this->stats
    ->groupBy(function ($stat) {
        return $stat->created_at->format('Y-m-d');
    })
    ->map(function ($stats) {
        $times = [];

        for ($hour = 0; $hour < 24; $hour++) {
            $thisHour = $stats->filter(function ($stat) use ($hour) {
                return (int) $stat->created_at->format('H') === $hour;
            });

            $times[$hour] = $thisHour->isNotEmpty()
                ? $thisHour->sum(function ($stat) {
                    return $stat->data->count;
                }) : 0;
        }

        return $times;
    });

Это выводит что-то вроде этого:

{
    "2018-12-20": {
        0: 54,
        1: 87,
        2: 18,
        3: 44,
        4: 35,
        ...
    }
}

Таким образом, он сгруппирован по дате, и каждая дата содержит 0-23 (часы дня) с соответствующим значением (в данном случае суммирование свойства строки data-> count).

В другом запросе я смог получить суммирование свойства data-> count, используя следующее:

SELECT SUM(data->>\"$.count\") AS value

Так возможно ли это вообще сделать в SQL? Я представляю, что там есть столбцы даты, плюс столбец часов, поэтому hour_0, hour_1 и т. д. Со значениями под ними.

Любая помощь будет принята с благодарностью!

Как выглядит стол?

WillardSolutions 20.12.2018 16:03

Это не запрос к базе данных, а коллекция Laravel с некоторыми функциями. Откуда берется $this->stats?

Jerodev 20.12.2018 16:07

Обновленный пост - $this->stats - это красноречивый сборник всех строк в таблице

J. Kingsley 20.12.2018 16:09

Добавлены изображения стола

J. Kingsley 20.12.2018 16:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
4
54
2

Ответы 2

Первый шаг, который я хотел бы сделать, чтобы понять, как это делает Laravel, - это включить ведение журнала запросов и сбросить запрос;

DB::connection()->enableQueryLog();
// ... do your query
$queries = DB::getQueryLog();

Это позволит вам воссоздать запрос Eloquent на простом SQL. Оттуда вы можете работать над оптимизацией и конденсацией.

https://laravel.com/docs/5.0/database#query-logging

Извините, возможно, я не совсем понял - код, который я поместил выше, взят из Laravel Collections, поэтому $this->stats - это всего лишь все строки в таблице.

J. Kingsley 20.12.2018 16:07

ПЕРЕДАЧА

Поскольку вы теперь включили структуру таблицы, следующий запрос должен дать вам требуемые результаты в табличном формате. Вам нужно проанализировать результаты, чтобы преобразовать их в json.

Обновленный SQL

SELECT DATE_FORMAT(stats.updated_at, "%Y-%m-%d") AS `date`,
    HOUR(stats.updated_at) AS `hour`,
    COUNT(stats.id) AS record_count
FROM stats
GROUP BY `date`, `hour`
ORDER BY 1 ASC, 2 ASC

Полученные табличные данные будут выглядеть примерно так.

Я обновил ответ, чтобы он соответствовал структуре таблицы.

nazim 21.12.2018 15:07

Другие вопросы по теме