У вас есть два варианта: либо создать таблицу поиска с указанием возможных часов, либо использовать странный запрос, включающий двойную таблицу и объединение, чтобы получить искомые значения.
В первом случае, у вас будет таблица с, может быть, одним полем на данный момент, давайте просто назовем ее часами, а это поле timeofday.
В часах timeofday у вас будут следующие данные:
timeofday
12AM
1AM
2AM
....
Тогда ваш запрос так же прост, как
SELECT hours.timeofday,
reference.referenceFormatID AS subgroup,
count(reference.referenceFormatID) AS count
FROM hours
LEFT JOIN reference on date_format(referenceTime,'%I %p') = hours.timeofday
GROUP BY hours.timeofday,subgroup ASC
РЕДАКТИРОВАТЬ
Чтобы получить все комбинации, вам также понадобится таблица форматов со всеми возможными идентификаторами формата, какбыл упомянут rfausak.Вы также можете сделать это с отдельным отчетом, но давайте просто предположим, что у вас есть эта таблица, назовем ее форматами.Опять же, эта таблица может иметь один столбец.
Часть 1 предназначена для получения всех комбинаций:
SELECT hours.timeofday,
formats.ID
from hours
join formats
Это декартово объединение, которое объединит все возможные часы и идентификаторы формата.
Теперь мы добавляем в LEFT JOIN
SELECT hours.timeofday,
formats.ID,
count(reference.subgroup)
FROM hours
JOIN formats
LEFT JOIN reference on date_format(referenceTime,'%I %p') = hours.timeofday
AND reference.subgroup = formats.ID
GROUP BY hours.timeofday,formats.ID ASC
Если вы попытаетесь сделать это с помощью поиска в DUAL таблице, вы можете использовать метод, аналогичный генерации дней из диапазона дат