Подсчитать из второй таблицы, количество записей за несколько промежутков времени

SELECT t1.*,
COUNT(CASE WHEN t2.time >= UNIX_TIMESTAMP() - 86400)  AS 24_hours,
COUNT(CASE WHEN t2.time >= UNIX_TIMESTAMP() - 172800) AS 48_hours,
COUNT(CASE WHEN t2.time >= UNIX_TIMESTAMP() - 259200) AS 72_hours
FROM table1 AS t1
LEFT JOIN table2 AS t2 ON t2.t1_id = t1.id

Не выходит, пытаюсь подсчитать, добавить 3 поля, 3 промежутка времени за которые по каждым из них. Необходимо подсчитать количество записей во второй таблице...


Ответы (1 шт):

Автор решения: shaman888

Для подсчета количества записей во второй таблице в зависимости от времени, вам нужно использовать агрегатную функцию COUNT() вместе с условными выражениями SUM() или другими агрегатными функциями. Если вы хотите добавить три поля, которые показывали бы количество записей за последние 24, 48 и 72 часа, ваш запрос можно модифицировать следующим образом:

SELECT 
    t1.*, 
    SUM(CASE WHEN t2.time >= UNIX_TIMESTAMP() - 86400 THEN 1 ELSE 0 END) AS count_24_hours,
    SUM(CASE WHEN t2.time >= UNIX_TIMESTAMP() - 172800 THEN 1 ELSE 0 END) AS count_48_hours,
    SUM(CASE WHEN t2.time >= UNIX_TIMESTAMP() - 259200 THEN 1 ELSE 0 END) AS count_72_hours
FROM 
    table1 AS t1
LEFT JOIN 
    table2 AS t2 ON t2.t1_id = t1.id
GROUP BY 
    t1.id;

Разбор запроса:
1. SUM(CASE WHEN ... THEN 1 ELSE 0 END): Эта конструкция считает, сколько раз условие выполняется, добавляя 1 для каждой записи, которая попадает под условие. Таким образом, для каждого временного промежутка вы получите количество соответствующих записей.

2. GROUP BY t1.id: Группировка по идентификатору из первой таблицы, чтобы получить суммированные результаты для каждой записи из table1.

3. LEFT JOIN: Используется для получения всех записей из table1 даже в том случае, если у них нет соответствующих записей в table2.

Этот запрос должен корректно подсчитать количество записей за каждый временной промежуток и вернуть его в виде отдельных столбцов для каждой записи в первой таблице.

→ Ссылка