2011-03-24 62 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 | 
+------------+-----------------+ 

干杯!