2011-03-24 57 views
1

過去幾個小時,我一直在撞牆,試圖讓這個單一的查詢工作,但沒有成功。使用DATE_FORMAT別名的MySQL子查詢計數

我有一個名爲viewer_log的表。

每一行都是一個帶有session_id和時間戳記的瀏覽量。

我有麻煩格式化時間戳爲一天,按當天分組,但是然後計算每天UNIQUE會話的數量。

到目前爲止,該查詢(也花了很長的時間去工作)是:

SELECT day, COUNT(*) as unique_sessions from (SELECT COUNT(viewer_session_id) AS sessions, DATE_FORMAT(timestamp, "%Y-%m-%d") AS day FROM viewer_log GROUP BY `viewer_session_id` HAVING day='2011-03-23') AS sessions; 

你會發現這一天是硬編碼,讓

mysql> SELECT day, COUNT(*) as unique_sessions from (SELECT COUNT(viewer_session_id) AS sessions, DATE_FORMAT(timestamp, "%Y-%m-%d") AS day FROM viewer_log GROUP BY `viewer_session_id` HAVING day='2011-03-23') AS sessions; 
+------------+-----------------+ 
| day  | unique_sessions | 
+------------+-----------------+ 
| 2011-03-23 |    21 | 
+------------+-----------------+ 

我想擴大這些結果,而不必指定一天,這是我遇到問題的地方,無法在互聯網上找到答案......我確信它在那裏,不知道我在找什麼。

EG:

+------------+-----------------+ 
| day  | unique_sessions | 
+------------+-----------------+ 
| 2011-03-21 |    14 | 
| 2011-03-22 |    11 | 
| 2011-03-23 |    21 | 
+------------+-----------------+ 

我有很多的麻煩移動過去的這一點上,我試圖與它自身的拷貝加入表,但通常碰到一個未知的列名或結果我認爲應該被顯示出來是錯誤的:

mysql> select DATE_FORMAT(v.timestamp, "%Y-%m-%d") AS date, count(sessions) as rows from (SELECT COUNT(viewer_session_id) AS sessions, DATE_FORMAT(timestamp, "%Y-%m-%d") AS date FROM viewer_log GROUP BY viewer_session_id) AS s JOIN viewer_log v ON (s.date=date) GROUP BY date; 

+------------+--------+ 
| date  | rows | 
+------------+--------+ 
| 0000-00-00 | 2551 | 
| 0000-00-00 | 20408 | 
| 0000-00-00 | 20408 | 
| 0000-00-00 | 5102 | 
| 0000-00-00 | 2551 | 
| 0000-00-00 | 2551 | 
| 0000-00-00 | 63775 | 
| 0000-00-00 | 211733 | 
| 0000-00-00 | 53571 | 
| 0000-00-00 | 53571 | 
| 0000-00-00 | 53571 | 
| 0000-00-00 | 51020 | 
| 0000-00-00 | 48469 | 
| 0000-00-00 | 91836 | 
| 0000-00-00 | 86734 | 
| 0000-00-00 | 33163 | 
| 0000-00-00 | 45918 | 
| 0000-00-00 | 28061 | 
| 0000-00-00 | 86734 | 
| 0000-00-00 | 76530 | 
| 0000-00-00 | 53571 | 
| 0000-00-00 | 33163 | 
+------------+--------+ 
22 rows in set, 1 warning (0.63 sec) 

回答

1

嘗試

SELECT DATE(timestamp) AS day, 
     COUNT(0) as unique_sessions 
    FROM viewer_log 
GROUP BY DATE(timestamp), viewer_session_id 

可以添加其中c ondition像

SELECT DATE(timestamp) AS day, 
     COUNT(0) as unique_sessions 
    FROM viewer_log 
    WHERE DATE(timestamp) >= '2011-03-01' 
    AND DATE(timestamp) <= '2011-03-21' 
GROUP BY DATE(timestamp), viewer_session_id 

這是假設的時間戳是一個MySQL時間戳,而不是一個Unix時間戳

+0

謝謝!我最終做的是: – ilovett 2011-03-25 17:03:54

1

感謝,修改你的建議,我落得這樣做是:

mysql> SELECT day, COUNT(*) AS unique_sessions FROM (SELECT DATE(timestamp) AS day, COUNT(0) as unique_sessions FROM viewer_log GROUP BY day, viewer_session_id) as blah GROUP BY blah.day ORDER BY day DESC; 
+------------+-----------------+ 
| day  | unique_sessions | 
+------------+-----------------+ 
| 2011-03-24 |    14 | 
| 2011-03-23 |    23 | 
| 2011-03-22 |    30 | 
| 2011-03-21 |    35 | 
| 2011-03-20 |    11 | 
| 2011-03-19 |    18 | 
| 2011-03-18 |    15 | 
| 2011-03-17 |    34 | 
| 2011-03-16 |    37 | 
| 2011-03-15 |    21 | 
| 2011-03-14 |    20 | 
| 2011-03-13 |    21 | 
| 2011-03-12 |    21 | 
| 2011-03-11 |    21 | 
| 2011-03-10 |    84 | 
| 2011-03-09 |    26 | 
| 2011-03-07 |    1 | 
| 2011-03-05 |    1 | 
| 2011-03-04 |    2 | 
| 2011-03-03 |    9 | 
| 2011-03-02 |    9 | 
| 0000-00-00 |    1 | 
+------------+-----------------+ 

乾杯!