我有MySQL表
CREATE TABLE cms_webstat (
ID int NOT NULL auto_increment PRIMARY KEY,
TIMESTAMP_X timestamp DEFAULT CURRENT_TIMESTAMP,
# ... some other fields ...
)
Run Code Online (Sandbox Code Playgroud)
其中包含有关网站访问者的统
为了每小时访问我使用
SELECT
hour(TIMESTAMP_X) as HOUR
, count(*) AS HOUR_STAT
FROM cms_webstat
GROUP BY HOUR
ORDER BY HOUR DESC
Run Code Online (Sandbox Code Playgroud)
这给了我
| HOUR | HOUR_STAT |
| 24 | 15 |
| 23 | 12 |
| 22 | 9 |
| 20 | 3 |
| 18 | 2 |
| 15 | 1 |
| 12 | 3 |
| 9 | 1 |
| 3 | 5 |
| 2 | 7 |
| 1 | 9 |
| 0 | 12 |
Run Code Online (Sandbox Code Playgroud)
我想得到以下:
| HOUR | HOUR_STAT |
| 24 | 15 |
| 23 | 12 |
| 22 | 9 |
| 21 | 0 |
| 20 | 3 |
| 19 | 0 |
| 18 | 2 |
| 17 | 0 |
| 16 | 0 |
| 15 | 1 |
| 14 | 0 |
| 13 | 0 |
| 12 | 3 |
| 11 | 0 |
| 10 | 0 |
| 9 | 1 |
| 8 | 0 |
| 7 | 0 |
| 6 | 0 |
| 5 | 0 |
| 4 | 0 |
| 3 | 5 |
| 2 | 7 |
| 1 | 9 |
| 0 | 12 |
Run Code Online (Sandbox Code Playgroud)
我应该如何修改查询以获得这样的结果(使用一个mysql查询,而不创建临时表)?
是否有可能通过一个MySQL查询得到这样的结果?
使用单个列创建另一个表,
CREATE TABLE hours_list (
hour int NOT NULL PRIMARY KEY
)
Run Code Online (Sandbox Code Playgroud)
全部24小时填写.
然后在该表上进行连接以填充零.
SELECT
hs.hour as HOUR, COUNT(ws.ID) AS HOUR_STAT
FROM hours_list hs
LEFT JOIN cms_webstat ws ON hs.hour = hour(ws.TIMESTAMP_X)
GROUP BY hs.hour
ORDER BY hs.hour DESC
Run Code Online (Sandbox Code Playgroud)
这只是“为什么它没有返回”部分。马库斯的回答涵盖了“如何做”部分。
SQL
SELECT
hour(TIMESTAMP_X) as HOUR
, count(*) AS HOUR_STAT
FROM cms_webstat
GROUP BY HOUR
ORDER BY HOUR DESC
Run Code Online (Sandbox Code Playgroud)
获取每小时记录的计数,对于表中存在的时间戳
它没有给出表中没有的细节。由于与小时对应的时间戳没有记录8(来自您的示例),因此 SQL 不返回任何记录。
我终于找到了答案。也许我疯了,但这确实有效。
选择小时,最大值(HOUR_STAT) 作为 HOUR_STAT FROM (
(
选择 HOUR(TIMESTAMP_X) 作为 HOUR,计数(*) 作为 HOUR_STAT
来自 cms_webstat
WHERE 日期(TIMESTAMP_X) = 日期(now())
)
UNION(选择 0 作为小时,0)
UNION(选择 1 作为小时,0)
UNION(选择 2 作为小时,0)
UNION(选择 3 作为小时,0)
UNION(选择 4 作为小时,0)
UNION(选择 5 作为小时,0)
UNION(选择 6 作为小时,0)
UNION(选择 7 作为小时,0)
UNION(选择 8 作为小时,0)
UNION(选择 9 作为小时,0)
UNION(选择 10 作为小时,0)
UNION(选择 11 作为小时,0)
UNION(选择 12 作为小时,0)
UNION(选择 13 作为小时,0)
UNION(选择 14 作为小时,0)
UNION(选择 15 作为小时,0)
UNION(选择 16 作为小时,0)
UNION(选择 17 作为小时,0)
UNION(选择 18 作为小时,0)
UNION(选择 19 作为小时,0)
UNION(选择 20 作为小时,0)
UNION(选择 21 作为小时,0)
UNION(选择 22 作为小时,0)
UNION(选择 23 作为小时,0)
)
AS `组合表`
按小时分组
按小时描述排序
根据需要进行一个 MySQL 查询。