Uw bestaande zoekopdracht kan worden teruggebracht tot:
SELECT CONCAT(HOUR(created), ':00-', HOUR(created)+1, ':00') AS Hours
, COUNT(*) AS `usage`
FROM history
WHERE created BETWEEN '2012-02-07' AND NOW()
GROUP BY HOUR(created)
Om elke weer te geven uur, inclusief de uren waarvoor geen gegevens zijn, moet u outer joinen met een tabel met alle uren waarvoor u gegevens wilt. U kunt zo'n tabel in uw zoekopdracht bouwen met UNION
:
SELECT CONCAT(Hour, ':00-', Hour+1, ':00') AS Hours
, COUNT(created) AS `usage`
FROM history
RIGHT JOIN (
SELECT 0 AS Hour
UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6
UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12
UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15
UNION ALL SELECT 16 UNION ALL SELECT 17 UNION ALL SELECT 18
UNION ALL SELECT 19 UNION ALL SELECT 20 UNION ALL SELECT 21
UNION ALL SELECT 22 UNION ALL SELECT 23
) AS AllHours ON HOUR(created) = Hour
WHERE created BETWEEN '2012-02-07' AND NOW() OR created IS NULL
GROUP BY Hour
ORDER BY Hour
De behandeling van groepen waarvoor geen gegevens bestaan, is echter een kwestie van bedrijfslogica die het best in uw gegevenstoegangslaag kan worden geplaatst in plaats van in de database zelf:het zou inderdaad triviaal moeten zijn voor uw toepassing om een nulwaarde te gebruiken wanneer een uur afwezig.