Чтобы получить результат, полученный от MySQL, используя инструкцию SELECT, должен быть источник строки, который возвращает значения часов, которые «отсутствуют» из таблицы, из которой мы получаем счет.
(Получение этого результата из запроса - это только одна опция, мы можем поступить по-другому и сделать это на клиенте. Например, заполнив массив требуемыми часами, затем запустите исходный запрос и назначьте подсчитайте соответствующий соответствующий элемент массива. Этот ответ является демонстрацией того, как мы можем заставить MySQL вернуть указанный результат.)
В качестве одного из примеров того, как мы можем это сделать, вот запрос, который возвращает 24 строки целочисленных значений От 0 до 23. 23.
SELECT 00 AS hr UNION ALL SELECT 01 UNION ALL SELECT 02 UNION ALL SELECT 03
UNION ALL SELECT 04 UNION ALL SELECT 05 UNION ALL SELECT 06 UNION ALL SELECT 07
UNION ALL SELECT 08 UNION ALL SELECT 09 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
Мы можем обернуть этот запрос в parens и указать, что вместо таблицы в другом qu чень.
SELECT i.hr
FROM (-- 0 thru 23
SELECT 00 AS hr UNION ALL SELECT 01 UNION ALL SELECT 02 UNION ALL SELECT 03
UNION ALL SELECT 04 UNION ALL SELECT 05 UNION ALL SELECT 06 UNION ALL SELECT 07
UNION ALL SELECT 08 UNION ALL SELECT 09 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
) i
ORDER BY i.hr
Есть и другие способы вернуть набор целых чисел. Этот пример является всего лишь примером встроенного представления (производной таблицы), содержащегося в запросе. Это не зависит от каких-либо дополнительных таблиц в базе данных.
Если у нас есть таблица в базе данных, содержащая 24 строки с целыми значениями от 0 до 23, мы могли бы ссылаться на это вместо встроенного представления.
Мы также можем добавить предложение WHERE
к внешнему запросу, чтобы исключить строки, которые имеют значение hr
, позднее текущего часа.
И если мы хотим вернуть двухзначный час (с начальным нулем), мы можем использовать выражение в списке SELECT. Есть несколько выражений, которые сделают трюк.
SELECT RIGHT(CONCAT('0',i.hr),2) AS hh
FROM (-- 0 thru 23
SELECT 00 AS hr UNION ALL SELECT 01 UNION ALL SELECT 02 UNION ALL SELECT 03
UNION ALL SELECT 04 UNION ALL SELECT 05 UNION ALL SELECT 06 UNION ALL SELECT 07
UNION ALL SELECT 08 UNION ALL SELECT 09 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
) i
WHERE i.hr <= HOUR(NOW())
ORDER BY i.hr
Мы «сопоставляем» строки, возвращенные из этого, с подсчетами, возвращаемыми из исходного запроса. Мы можем использовать внешнюю операцию соединения, поэтому возвращаем строку в течение часа, когда нет соответствующей строки из запроса count.
Чтобы получить «пропавших без вести» Граф возвращается в ноль, мы выполняем условный тест, и заменить значение NULL с 0.
SELECT RIGHT(CONCAT('0',i.hr,2)) AS hh
, IFNULL(t.cnt,0) AS visits
, IFNULL(t.pw,0) AS pw
FROM (-- 0 thru 23
SELECT 00 AS hr UNION ALL SELECT 01 UNION ALL SELECT 02 UNION ALL SELECT 03
UNION ALL SELECT 04 UNION ALL SELECT 05 UNION ALL SELECT 06 UNION ALL SELECT 07
UNION ALL SELECT 08 UNION ALL SELECT 09 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
) i
LEFT
JOIN (-- counts by hour
SELECT HOUR(FROM_UNIXTIME(s.time)) AS hr
, COUNT(*) AS cnt
, MAX(s.pw) AS pw
FROM clientstats s
WHERE s.siteid = '$siteid'
AND s.time >= UNIX_TIMESTAMP(DATE(NOW()))
AND s.time < UNIX_TIMESTAMP(NOW())
GROUP BY HOUR(FROM_UNIXTIME(s.time))
) t
ON t.hr = i.hr
WHERE i.hr <= HOUR(NOW())
ORDER BY i.hr ASC
Есть несколько различных запросов, которые возвращают указанное результат. Но трюк ...чтобы вернуть нулевой счет, нужно иметь источник строки, который возвращает возвращаемые значения часов, даже если эти значения часов не существуют в таблице, из которой мы получаем счет.
Я попробовал этот запрос, но ничего не отображается? Можете ли вы объяснить больше. мой текущий точный запрос - это время SELECT, COUNT (*), wh FROM statxyx WHERE siteid = '$ siteid' AND time> UNIX_TIMESTAMP (DATE_SUB (NOW(), INTERVAL 26970 SECOND)) GROUP BY HOUR (FROM_UNIXTIME ('time')) ORDER BY время ASC – PARVINDER