2014-11-14 60 views
1

我有一个简单timestamptable S,t YPES和c ounts像包括MySQL的结果空行

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 

现在我得到它通过t,并在一定日期YYYY-MM-DD计数c栏目组的结果

我必须将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 =>t_1,2 =>t_2,3 =>t_3
  • 还与0值(2014-12-06)枣应包括
  • 建查询我将使用PHP(foreach)

回答

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不同的值,这成为相当不现实的,并且你必须看看更复杂的技术像这样的:​​

编辑: 如果您想要包含完全没有数据的日期,那么您应该考虑创建一个日期表,然后'将它加入'到结果集中。您可以使用此代码(https://gist.github.com/johngrimes/408559) - 只是忽略创建数字表的前两个语句。

+0

是的,但我需要空值,以及('2014-12-06') – Xaver 2014-11-14 16:57:10

+0

可以大家分享一个例子吗? – Xaver 2014-11-14 21:30:20

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

(?)

+0

是的,但我也需要空值('2014-12-06') – Xaver 2014-11-14 16:29:36

+0

在'else null'的部分,你可以把“else”或“else 0” – Gonzalo1987 2014-11-14 16:41:07