mysql - 转换查询以处理空集结果

标签 mysql

我的问题是我正在运行一个查询,有时会出现一组空结果(没有返回任何内容)。我需要修改输出,以便仍然用适当的“0”计数表示没有数据的小时数。以下文档列出了我正在使用的查询以及示例输出。

当前使用的查询:

select date(look) as "Day",concat(date_format(look, '%H'),':00') as "Hour", count(distinct(session_name)) as "Count"
from db.login_stats 
where look > '2015-10-06' 
group by date(look),concat(date_format(look, '%H'),':00');

当前输出:

+------------+-------+-------+
| Day        | Hour  | Count |
+------------+-------+-------+
| 2015-10-07 | 09:00 |     1 |
| 2015-10-07 | 10:00 |     1 |
| 2015-10-07 | 11:00 |     1 |
| 2015-10-07 | 12:00 |     2 |
| 2015-10-07 | 13:00 |     2 |
| 2015-10-07 | 14:00 |     2 |
| 2015-10-07 | 15:00 |     1 |
| 2015-10-07 | 18:00 |     1 |

我希望输出类似于:

+------------+-------+-------+
| Day        | Hour  | Count |
+------------+-------+-------+
| 2015-10-07 | 00:00 |     0 |
| 2015-10-07 | 01:00 |     0 |
| 2015-10-07 | 02:00 |     0 |
| 2015-10-07 | 03:00 |     0 |
| 2015-10-07 | 04:00 |     0 |
| 2015-10-07 | 05:00 |     0 |
| 2015-10-07 | 06:00 |     0 |
| 2015-10-07 | 07:00 |     0 |
| 2015-10-07 | 08:00 |     0 |
| 2015-10-07 | 09:00 |     1 |
| 2015-10-07 | 10:00 |     1 |
| 2015-10-07 | 11:00 |     1 |
| 2015-10-07 | 12:00 |     2 |
| 2015-10-07 | 13:00 |     2 |
| 2015-10-07 | 14:00 |     2 |
| 2015-10-07 | 15:00 |     1 |
| 2015-10-07 | 16:00 |     0 |
| 2015-10-07 | 17:00 |     0 |
| 2015-10-07 | 18:00 |     1 |
| 2015-10-07 | 19:00 |     0 |
| 2015-10-07 | 20:00 |     0 |
| 2015-10-07 | 21:00 |     0 |
| 2015-10-07 | 22:00 |     0 |
| 2015-10-07 | 23:00 |     0 |

关于如何实现这一目标有什么建议吗?

最佳答案

据我所知,没有什么简单的方法可以做到这一点,但它是可以实现的。以下查询将打印与 WHERE 子句匹配的每天的所有 24 小时(例如,它将打印当前数据所需的输出,并且如果您插入 look 等于 2015-10-08 它将在输出中添加 24 行):

-- populate a table with 24 rows, one per hour

create table hours(hour time);
insert into hours values(0), (10000), (20000);
insert into hours select hour + 30000 from hours;
insert into hours select hour + 60000 from hours;
insert into hours select hour + 120000 from hours;

-- now this query will do what you want

select dates.d as "Day",dates.h as "Hour", count(distinct(session_name)) as "Count"
from db.login_stats RIGHT JOIN
    (
    SELECT date(look) as d, concat(date_format(hour, '%H'),':00') as h
    FROM login_stats CROSS JOIN hours
    WHERE date(look) > '2015-10-06' -- moved your WHERE here
    GROUP BY 1, 2
    ORDER BY 1, 2
    ) dates
    ON date(look) = d AND concat(date_format(look, '%H'),':00') = h
group by dates.d, dates.h;

关于mysql - 转换查询以处理空集结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33768874/

相关文章:

mysql - #1054 - MySQL 中 'proximite' 中的未知列 'where clause'

php - 插入数据作为时间点,检索数据作为时间范围

mysql - MySQL 中何时使用单引号、双引号和反引号

mysql - 将两列相乘为第三列,其中一列是sql中的count(*)

python - 大表上的连接查询非常慢(机器 = Xeon 2.4 GHz,16 核,64 GB RAM)

python - 用于 Python 的 MySQL 连接器

php - php中Mysql数据库行值获取问题

mysql - 按 asc 和 desc 排序没有给出正确的结果

Mysql触发器将数据从一个表传递到另一个匹配表

使用带收缩的排序规则时的 MySQL 字符串前缀匹配