MySQL使用单个表离开了连接

时间:2010-12-29 10:30:11

标签: mysql datetime join group-by

使用以下查询获取每小时的交易细分

SELECT hour(Stamp) AS Hour, count(1) AS Count FROM Transactions GROUP by 1 WITH ROLLUP;

结果如下:

+------+-------+
| Hour | Count |
+------+-------+
|    0 |   269 |
|    1 |   342 |
|    2 |   319 |
|    3 |   284 |
|    4 |   235 |
|    5 |   174 |
|    6 |    91 |
|    7 |    54 |
|    8 |    31 |
|    9 |    21 |
|   10 |    21 |
|   11 |     1 |
| NULL |  1842 |
+------+-------+

我想显示0个交易的小时数(例如,在这个例子中,12到23之间的每小时都会显示'0')。最简单的方法是什么?

2 个答案:

答案 0 :(得分:1)

尝试这样的事情(-1 hour_id用于汇总总数):

drop table if exists hours;
create table hours(hour_id tinyint primary key) engine=innodb;

insert into hours (hour_id) values 
(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),
(13),(14),(15),(16),(17),(18),(19),(20),(21),(22),(23),(0),(-1);

select
 h.hour_id,
 if(t.counter is null, 0, t.counter) as counter
from
 hours h
left outer join 
(
 select 
    if(hour(stamp) is null, -1, hour(stamp)) as hour_id, 
    count(stamp) as counter
 from 
    transactions group by stamp with rollup
) t
on h.hour_id = t.hour_id;

如果你想要它几个月创建一个月表1..12 + -1等...

答案 1 :(得分:1)

SELECT Temp.Hour, COUNT(1)
FROM (
    SELECT 0  AS Hour UNION
    SELECT 1  UNION
    SELECT 2  UNION
    SELECT 3  UNION
    SELECT 4  UNION
    SELECT 5  UNION
    SELECT 6  UNION
    SELECT 7  UNION
    SELECT 8  UNION
    SELECT 9  UNION
    SELECT 10 UNION
    SELECT 11 UNION
    SELECT 12 UNION
    SELECT 13 UNION
    SELECT 14 UNION
    SELECT 15 UNION
    SELECT 16 UNION
    SELECT 17 UNION
    SELECT 18 UNION
    SELECT 19 UNION
    SELECT 20 UNION
    SELECT 21 UNION
    SELECT 22 UNION
    SELECT 23
) AS Temp
LEFT JOIN Transactions
ON Temp.Hour = HOUR(Transactions.Stamp)
GROUP BY Temp.Hour
ORDER BY Temp.Hour