在mysql结果中包含空行

时间:2014-11-14 16:20:34

标签: mysql

我有一个简单的table timestamp s,t ypes和c

timestamp |t|c
==============
1415024797|1|1
1415025774|1|1
1415202785|1|1
1415204559|1|1
1415204593|1|2
1415629057|1|1
1415791322|2|1
1415797887|1|1

现在我得到一个结果,该结果按c列出t列组并计算某个日期YYYY-MM-DD

我必须在时间戳中添加3600以尊重时区偏移量!

SELECT From_unixtime(a.timestamp + 3600, '%Y-%m-%d')        AS date, 
       Count(From_unixtime(a.timestamp + 3600, '%Y-%m-%d')) AS count, 
       a.t  AS type
FROM   table AS a
WHERE a.timestamp >= 1415322000 AND a.timestamp < 1415926800
GROUP  BY From_unixtime(a.timestamp + 3600, '%Y-%m-%d'), 
          a.t
ORDER  BY a.timestamp DESC 

使用此查询我得到类似

的内容
date       |count | type
==========================
2014-12-03 | 3    | 1
2014-12-03 | 1    | 2
2014-12-04 | 3    | 1
2014-12-05 | 3    | 3
2014-12-07 | 4    | 2
2014-12-07 | 7    | 3
....

但我想得到

date       | t_1 | t_2 | t_3
=============================
2014-12-03 | 3   | 1   | 0
2014-12-04 | 3   | 0   | 0    
2014-12-05 | 0   | 0   | 3 
2014-12-06 | 0   | 0   | 0   
2014-12-07 | 0   | 4   | 7   
....

因此,在每一行上都有一个日期,其中包含特定类型的所有计数。

  • 只有3种类型(1 =&gt; t_1,2 =&gt; t_2,3 =&gt; t_3
  • 还应包含0值(2014-12-06)的日期
  • 构建查询我将使用PHP(foreach)

2 个答案:

答案 0 :(得分:1)

有一种相对简单的方法可以做到这一点,但重复/丑陋的代码量随着t值的增加而增加:

你基本上做的是:

select date,
       count(case when type=1 then 1 else null end) as t1_count,
       count(case when type=2 then 1 else null end) as t2_count... 
et cetera

如果你期望有很多不同的t值,这就变得非常不切实际了,你必须要考虑更复杂的技术,例如:http://www.artfulsoftware.com/infotree/qrytip.php?id=523

编辑: 如果您想要包含根本没有数据的日期,那么您应该考虑创建一个日期表,然后“离开”加入&#39;它到你的结果集。您可以使用此代码(https://gist.github.com/johngrimes/408559) - 只需忽略创建数字表的前两个语句。

答案 1 :(得分:1)

SELECT From_unixtime(a.timestamp + 3600, '%Y-%m-%d')        AS date,
    CASE 
       WHEN type = 1 
          THEN count 
       ELSE 
          NULL 
    END AS t_1,
    CASE 
       WHEN type = 2 
       THEN count ELSE NULL END AS t_2,
    CASE 
       WHEN type = 3 
       THEN count ELSE NULL END AS t_3
FROM...

(?)