2017-08-30 84 views
0
一天

我希望得到一個數字,在過去一週內至少登錄一次的用戶,但我希望它能夠獨立地計算每一天的用戶,所以按星期編號分組將不起作用。號碼,在過去7天登錄至少一次,一天

crm_login_info表結構看起來像這樣:

user_id (INT) | login_time (DATETIME) 
      1 | 2017-08-10 14:32:25 
      2 | 2017-08-11 14:32:25 
      3 | 2017-08-11 14:32:25 
      2 | 2017-08-13 14:32:25 
      3 | 2017-08-14 14:32:25 
      4 | 2017-08-15 14:32:25 
      5 | 2017-08-15 14:32:25 
      2 | 2017-08-18 14:32:25 
      1 | 2017-08-19 14:32:25 
      3 | 2017-08-20 14:32:25 
      5 | 2017-08-20 14:32:25 
      2 | 2017-08-21 14:32:25 
      3 | 2017-08-22 14:32:25 

我有2個索引 - 一個是對user_idlogin_time和第二隻login_time

我試圖做到的,是功能,這對於上述一組數據將輸出的東西沿着這些路線:

2017-08-10 | 1 
2017-08-11 | 3 
2017-08-12 | 3 
2017-08-13 | 3 
2017-08-14 | 3 
2017-08-15 | 5 
2017-08-16 | 5 
2017-08-17 | 4 
2017-08-18 | 4 
2017-08-19 | 5 
2017-08-20 | 5 
2017-08-21 | 5 
2017-08-22 | 4 

我已經有一個應該查詢走到工作:

SELECT DISTINCT(DATE_FORMAT(`login_time`,'%Y-%m-%d')) AS date1, (
SELECT COUNT(DISTINCT `user_id`) 
FROM crm_login_info 
WHERE `login_time` > DATE_SUB(date1, INTERVAL 6 DAY) AND `login_time` <= 
DATE_ADD(date1, INTERVAL 1 DAY)) AS distinct1 
FROM crm_login_info 
ORDER BY date1 ASC 

但首先,它給我的警告有關在較低的查詢中使用date1,二是當我這整個查詢之前運行EXPLAIN它告訴我,子查詢distinct1不使用任何指標,恐怕它將會運行很長時間,因爲它是非常大的表格(大約7米行),並且公平地說,即使使用WHERE login_time > '2017-08-28'關閉數據,我也無法完成該查詢。

雖然我知道我可以只把它分解了數百查詢(每天一個),並保存在某個地方,因爲過去的數據不會改變,我在尋找一些更有活力的解決方案,因爲我不想讓通過在db中添加另一個文件/表格來進一步增加我的系統的複雜性,僅用於單個統計。

我已經在網上尋找解決方案,但找不到任何對我有幫助的事情。感謝您提供的任何幫助,如果您需要進一步澄清,請隨時通過評論提問。

編輯:我希望過去幾天,至少過去一年中每天都會生成這些數據。此外,爲了進一步澄清,我想不同用戶記錄在過去7天,沒有量限制登錄的次數,我希望它產生它過去的日子裏爲好,例如日期2017-08-22它會從計算出不同user_id小號範圍2017-08-162017-08-22包括這些日期。

+0

請說明一下:過去一週還是過去一年? – Pharaoh

+0

用戶在過去7天內,每天至少從一年前生成的天數 –

+0

說實話,對我來說,這看起來不像mysql(或其他查詢語言)的工作。我只是在@Pharaoh答案中得到查詢結果,然後只是從這個查詢的結果中計算出期望的結果 - 它在任何編程語言中都只是一個簡單的循環。 – Drecker

回答

0

您是否試過GROUP BY查詢?

SELECT DATE_FORMAT(login_time, '%Y-%m-%d') date1, count(DISTINCT user_id) 
FROM login_info 
WHERE date > DATE_SUB(NOW(), INTERVAL 7 DAY) 
GROUP BY DATE(login_time) 
ORDER BY date1 DESC 
+0

難道不是每天都記錄爲7而不是1的用戶嗎?另外,前一週的前幾天呢? –

+0

呃?應該是'COUNT(DISTINCT user_id)'而不是'COUNT(*)',否則我相信這個查詢應該正常工作。(它肯定不會計算每天登錄爲7的用戶,因爲這隻會計算總計行數) – Drecker

+0

@Drecker OP要每天計算「過去7天的訪問量」,而不是今天的訪問量。關於'DISTINCT'的評論是正確的,但我改變了這一點。 – Pharaoh