У меня есть следующая таблица. И я пытаюсь получить общее количество продуктов за каждые 3 часа, а также хочу отображать 0, если ни один продукт не существует в определенный период, а не отображает только существующие записи.
Я ближе и могу получать записи каждый час, но не в течение 3 часов. Пожалуйста, найдите следующие запросы, которые я использовал.
CREATE TABLE 'integers' (
'i' int(11) NOT NULL,
PRIMARY KEY ('i')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into 'integers'('i') values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16),(17),(18),(19),(20),(21),(22),(23);
а также
SELECT hr + INTERVAL 1 HOUR AS 'date', COUNT(products.product_id) AS product_count
FROM (
SELECT
FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(CURRENT_TIMESTAMP)/3600)*3600+1800) - INTERVAL i HOUR AS hr
FROM integers
WHERE i BETWEEN 0 AND HOUR(NOW())) AS times
LEFT OUTER JOIN product AS products
ON products.'updated_on' >= hr
AND products.'updated_on' < hr + INTERVAL 1 HOUR
AND products.'updated_on' > DATE(NOW())
GROUP
BY hr
ORDER
BY hr
С вышеуказанными запросами я могу получить агрегированный результат за каждый 1 час и вывод следующим образом
Но я хочу сделать это каждые 3 часа. Я чего-то не хватает, и я не могу понять это.
Попробуйте что-то вроде этого (с использованием оператора modulo):
SELECT hr.i as hr_from,
hr.i + 3 as hr_to,
COUNT(p.product_id) AS product_count
FROM integers hr
LEFT OUTER JOIN product AS p
ON p.updated_on >= DATE(NOW())
AND HOUR(p.updated_on) BETWEEN hr.i and hr.i + 2
WHERE hr.i MOD 3 = 0
GROUP BY hr.i
ORDER BY hr.i