MySQL:使用GROUP BY时用空填充空字段

Sal*_*ake 9 mysql group-by

我有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查询得到这样的结果?

Mar*_*ams 8

使用单个列创建另一个表,

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)


Niv*_*vas 5

这只是“为什么它没有返回”部分。马库斯的回答涵盖了“如何做”部分。

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 不返回任何记录。


Sal*_*ake 5

我终于找到了答案。也许我疯了,但这确实有效。

选择小时,最大值(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 查询。