2011-04-06 69 views
1

我有這樣的方案:MySQL的分組

+-------+ 
|posts: | 
+----+--+--------+--------------------+ 
| ID | title |  timestamp  | 
+----+-----------+--------------------+ 
| 1 | t1  |2011-04-05 17:54:55 | 
+----+-----------+--------------------+ 
| 2 | t2  |2011-04-06 09:10:11 | 
+----+-----------+--------------------+ 
| 3 | t3  |2011-04-07 02:07:22 | 
+----+-----------+--------------------+ 

我怎樣才能爲過去7天這樣的分組的總職位:

monday: 3 
Tuesday: 9 
Wednesday: 2 

回答

2

好,

你會必須選擇日期,進行計數(*)和按日期分組。

SELECT date_format(TIMESTAMP, '%d %m') 
     , COUNT(*) 
FROM posts 
WHERE TIMESTAMP BETWEEN FROMDATE AND TODATE 
GROUP BY date_format(TIMESTAMP, '%d %m') 

進一步的幫助和解釋: MySQL Manual for DATE_FORMAT

編輯:

平日也可以通過使用%的W這個功能來實現的。

1
SELECT WEEKDAY(timestamp), count(*) 
FROM POSTS as p1 
WHERE DATE_SUB(NOW(), INTERVAL 7 DAY) < timestamp 
GROUP BY YEAR(timestamp), MONTH(timestamp), DAY(timestamp) 
ORDER BY YEAR(timestamp) desc, MONTH(timestamp) desc, DAY(timestamp) desc 

查看MySQL中的date and time functions

+0

但如果某一天有0項,這一天都將丟失。 – greenbandit 2011-04-06 21:54:28

+0

增加星期幾(時間戳)進行澄清。 如果有0個條目,行將不會從一個單獨的表中顯示。除非每天有其他表格信息,否則我們可以進行左連接以確保所有行都存在,但是會導致相對較高的開銷。相反,我建議你可以在你的服務器端做這個簡單的檢查。 – Capitaine 2011-04-07 07:49:25

3

MySQL的具體解決方案:

SELECT WEEKDAY(timestamp_field) AS wd, count(*) FROM your_table GROUP BY wd; 

SELECT count(*) FROM your_table GROUP BY WEEKDAY(timestamp_field); 
+0

工作的很好,但是當一天中有零的時候沒有列入數組中。 – greenbandit 2011-04-06 20:58:55

+0

@greenbandit你真的需要零計數行嗎?所有錯過的平日都可以在申請級別明顯填滿。 – 2011-04-08 08:05:36