【问题标题】:MySQL: filling empty fields with zeroes when using GROUP BYMySQL:使用 GROUP BY 时用零填充空字段
【发布时间】:2011-01-29 14:27:30
【问题描述】:

我有 MySQL 表

CREATE TABLE cms_webstat (
    ID int NOT NULL auto_increment PRIMARY KEY,
    TIMESTAMP_X timestamp DEFAULT CURRENT_TIMESTAMP,
    # ... some other fields ...
)

其中包含有关网站访问者的统计信息。
为了获得每小时的访问次数,我使用

SELECT
    hour(TIMESTAMP_X) as HOUR
    , count(*) AS HOUR_STAT
FROM cms_webstat
GROUP BY HOUR
ORDER BY HOUR DESC

这给了我

| 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     |

我想获得以下信息:

| 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     |

我应该如何修改查询以获得这样的结果(使用一个 mysql 查询,而不创建临时表)?
是否有可能通过一个 MySQL 查询得到这样的结果?

【问题讨论】:

  • SaltLake,你认为你会接受答案吗?
  • Marcus,您的解决方案有效,但不是我想要的方式。我对使用一个 SQL 查询而不创建和填充另一个表的解决方案感兴趣。

标签: mysql group-by


【解决方案1】:

用单列创建另一个表,

CREATE TABLE hours_list (
    hour int NOT NULL PRIMARY KEY
)

填满所有 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

【讨论】:

    【解决方案2】:

    这只是“为什么不返回”部分。 Marcus 的回答涵盖了“如何做”部分。

    SQL

    SELECT 
        hour(TIMESTAMP_X) as HOUR 
        , count(*) AS HOUR_STAT 
    FROM cms_webstat 
    GROUP BY HOUR 
    ORDER BY HOUR DESC 
    

    获取每小时记录的计数,表中存在的时间戳

    它没有给出表格中不存在的内容的详细信息。由于没有对应于小时 8 的时间戳的记录(来自您的示例),因此 SQL 不返回任何记录。

    【讨论】:

      【解决方案3】:

      我终于找到了答案。 也许我疯了,但这行得通。

      SELECT HOUR, max(HOUR_STAT) as HOUR_STAT FROM ( ( 选择 HOUR(TIMESTAMP_X) 作为 HOUR,count(*) 作为 HOUR_STAT FROM cms_webstat WHERE 日期(TIMESTAMP_X)= 日期(现在()) ) UNION(选择 0 作为 HOUR,0) UNION(选择 1 作为 HOUR,0) UNION(选择 2 作为 HOUR,0) UNION(选择 3 作为 HOUR,0) UNION(选择 4 作为 HOUR,0) UNION(选择 5 作为 HOUR,0) UNION(选择 6 作为 HOUR,0) UNION(选择 7 作为 HOUR,0) UNION(选择 8 作为 HOUR,0) UNION(选择 9 作为 HOUR,0) UNION(选择 10 作为 HOUR,0) UNION(选择 11 作为 HOUR,0) UNION(选择 12 作为 HOUR,0) UNION(选择 13 作为 HOUR,0) UNION(选择 14 作为 HOUR,0) UNION(选择 15 作为 HOUR,0) UNION(选择 16 作为 HOUR,0) UNION(选择 17 作为 HOUR,0) UNION(选择 18 作为 HOUR,0) UNION(选择 19 作为 HOUR,0) UNION(选择 20 作为 HOUR,0) UNION(选择 21 作为 HOUR,0) UNION(选择 22 作为 HOUR,0) UNION(选择 23 作为 HOUR,0) ) 作为`combined_table` 按小时分组 按小时订购

      根据需要进行一个 MySQL 查询。

      【讨论】:

        【解决方案4】:
        $sql = 'SELECT g, MAX(v) AS v, MAX(c) AS c FROM (';
        $sql .= '(SELECT DATE_FORMAT(viewed, \'%d.%m.%Y\') AS g, COUNT(1) AS v, 0 AS c FROM '.$this->prefix.'view WHERE campaignid IN ('.join(', ',$ids).') GROUP BY g)';
        $sql .= ' UNION (SELECT DATE_FORMAT(clicked, \'%d.%m.%Y\') AS g, 0 AS v, COUNT(1) AS c FROM '.$this->prefix.'clicks WHERE campaignid IN ('.join(', ',$ids).') GROUP BY g)';
        $today = strtotime("00:00:00");
        for ($i=$today; $i>=time()-30*86400; $i-=86400) {
            $sql .= ' UNION (SELECT \''.date('d.m.Y',$i).'\' AS g, 0 AS v, 0 AS c)';
        }
        $sql .= ') AS tmp GROUP BY g ORDER BY g DESC';
        
        $chart = DB::getAll($sql);
        p($chart);
        

        谢谢!做好了!从 2 个表格,点击和查看,加入.. 作品。 ajaxel.com

        【讨论】:

          猜你喜欢
          • 2022-08-18
          • 2014-07-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-14
          相关资源
          最近更新 更多