我有下表,并且我尝试每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小时进行一次。我在某处缺少某些东西,无法弄清楚。
答案 0 :(得分:1)
尝试这样的事情(使用 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