2010-08-18 62 views
0

我有一个名为user_logins的表,它跟踪用户登录到系统中。它有三列,LOGIN_ID,USER_ID和login_time基于TIMESTAMP的MySQL分组月份

login_id(INT) | user_id(INT) | login_time(TIMESTAMP) 
------------------------------------------------------ 
    1  |  4  | 2010-6-14 08:54:36 
    1  |  9  | 2010-7-16 08:56:36 
    1  |  9  | 2010-8-16 08:59:19 
    1  |  9  | 2010-8-16 09:00:24 
    1  |  1  | 2010-8-16 09:01:24 

我期待编写一个查询,将决定独特的登录次数每天和计数,最多每月。如果用户在一天内登录两次,则只会计算一次。这个例子的输出是作为结果表八月只有2个是因为USER_ID 9在一天登录两次,他登录到系统只计为1所登录的那一天如下

month(VARCHAR) | logins(INT) 
--------------------------- 
June  |  1 
July  |  1 
August  |  2 

在堆栈溢出的帮助下,我写了一个查询,实现了这个功能,但由于某种原因,当我使用DATE_FORMAT函数时,仅仅使用'%M'尝试读取java中使用hibernate的值时,该对象被损坏并且不被识别为字符串。我想这可能是因为我的查询做错了。我的查询如下:

SELECT login_date, SUM(logins) as numLogins FROM (
    SELECT 
     DATE_FORMAT(DATE(login_time), '%M') AS login_date, 
     COUNT(DISTINCT login_id) AS logins 
    FROM user_logins 
    WHERE login_time > DATE_SUB(NOW() - INTERVAL 1 YEAR) 
    GROUP BY DATE(login_time)) 
AS Z GROUP BY(login_date)"; 
+0

不确定它是否是这里的拼写错误,或者您是否复制了代码,但是您在第一行末尾具有“FRMO”而不是“FROM”的SQL。 – gabe3886 2010-08-18 16:25:47

+0

只是编辑我的部分错别字。 – IamBanksy 2010-08-18 16:27:08

回答

1

为什么不使用提取(从login_time月)获取月份作为数值?

 
SELECT extract(month from login_time), 
     COUNT(DISTINCT login_id) AS logins 
FROM user_logins 
WHERE login_time > DATE_SUB(NOW() - INTERVAL 1 YEAR) 
GROUP BY extract(month from login_time) 
+0

,这给我一个语法错误,我没有意识到提取方法。 – IamBanksy 2010-08-18 16:37:23

+0

适用于MySQL 5.0 – 2010-08-18 16:42:19