2012-12-20 64 views
0

行可以說我有這看起來一個用戶表像Mysql的計數在一段時間

userID int(4) unsigned not null auto_increment, 
name varchar(50) not null, 
date_start int(10) unsigned not null, 
date_stop int(10) unsigned not null 

我想數着活躍的所有用戶(DATE_START和date_stop之間,這些都是unix_timestamps()),每月。

所以結果應該是這樣的:

2012/01 55 
2012/02 58 
2012/03 51 

我會說這樣的事情,但顯然我失去了一些東西:

SELECT 
    DATE_FORMAT(???, '%Y/%m'), 
    COUNT(userID) 
FROM users 
WHERE 
    ??? BETWEEN date_start AND date_stop 
GROUP BY DATE_FORMAT(???, '%Y%m'); 

...只是爲了澄清,對我有效的是:

SELECT m.yearMonth, COUNT(u.userID) 
FROM users u 
LEFT JOIN months m ON m.yearMonth BETWEEN DATE_FORMAT(FROM_UNIXTIME(u.date_start), '%Y%m') AND DATE_FORMAT(FROM_UNIXTIME(u.date_stop), '%Y%m') 
GROUP BY m.yearMonth; 

使用具有「所有」年/月存儲在YYYYMM。

回答

1

首先,你應該有一個包含了一年的表,一個月細節yyyyMM格式。然後,您需要將該表與用戶表加在一起,其中yyyyMM部分date_start小於月表中的值,date_end大於或等於月表中的值。

這會計算一個用戶活躍超過一個月,每月一次,我認爲這是您的期望。

CREATE TABLE months(yearMonth INT); 
INSERT INTO months VALUES(201201); 
INSERT INTO months VALUES(201202); 
INSERT INTO months VALUES(201203); 
.... 

SELECT m.yearMonth, COUNT(*) 
FROM 
    months m, users u 
WHERE 
    m.yearMonth >= CONVERT(INT, 
         CONVERT(VARCHAR(4), DATEPART(yy, date_start) + 
         CONVERT(VARCHAR(2), DATEPART(mm, date_start) 
        ) 
AND m.yearMonth <= CONVERT(INT, 
         CONVERT(VARCHAR(4), DATEPART(yy, date_end) + 
         CONVERT(VARCHAR(2), DATEPART(mm, date_end) 
        ) 

注意:這是SQL Server,但你應該可以得到與MySQL對應的CONVERT/DATEPART函數,我猜。

+0

我的第一個猜測是,這是正確的解決我的問題。去工作,我會盡快回復。 – b00st

+0

這一個做的工作,包括月表,雖然語法在MySQL不同。我做了一個LEFT JOIN,因爲我只想要至少有一個用戶處於活動狀態的結果。我想出了這個: SELECT m.yearMonth,COUNT(u.userID)FROM users u LEFT JOIN months m ON m.yearMonth BETWEEN DATE_FORMAT(FROM_UNIXTIME(u.date_start),'%Y%m')AND DATE_FORMAT( FROM_UNIXTIME(u.date_stop), '%Y%M')GROUP BY m.yearMonth; – b00st

0

嘗試類似的東西

SELECT DATE_FORMAT(???, '%Y/%m') , userID 
    FROM users 
    WHERE ??? BETWEEN '2012/01' AND '2012/05' 
    GROUP BY DATE_FORMAT(???, '%Y%m'); 

ü是正確的只是不使用count(userID)

編輯:

你缺少一列在您的數據庫。它應該是last_active_date,所以當用戶登錄它將更新這個日期last_active_date,你知道他在那個日期活躍。

在你的sql現在,你不知道他們是活躍的或當他們登錄? 如果你有此列就會像在你的SQL

WHERE last_active_date BETWEEN '2012/01' AND '2012/05' 
+0

問題是???。我希望它代表每個月/月的活動用戶,從date_start開始的第一年/月開始,並且從date_stop到最後一年/月。 – b00st

+0

看我的編輯答案。 –

+0

我的表已經有了,以date_stop的形式。一個例子行是: 1, '李四',1160863200(15-10-2006),1333144800(31-03-2012) – b00st

0

您可以爲此創建表格和觸發器。 其中active_user添加您必須增加表中的值。在用戶出口遞減。 此步驟後 用戶數將成爲表中的當前值。 (因爲「之間」不是大表格的精簡操作(如果你沒有字段date_start上的索引))。

相關問題