2014-11-14 54 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