2014-09-30 129 views
-1

我有這樣的表例如MYSQL - 計數具有獨特的價值

IP ADDRESS | DATE 

10.10.10.10 | 2014-09-01  
10.10.10.10 | 2014-09-12  
44.33.33.33 | 2014-09-12  
10.10.10.10 | 2014-09-15  
44.33.33.33 | 2014-09-16  
33.10.31.33 | 2014-09-18  
89.99.11.22 | 2014-09-18 
44.33.33.33 | 2014-09-19 
33.10.31.33 | 2014-09-22 
10.10.10.10 | 2014-09-24 

,我從表中要的是

TOTAL UNIQUE IP | DATE 

1   | 2014-09-01 <-- 10.10.10.10 
1   | 2014-09-12 <-- 44.33.33.33 
2   | 2014-09-18 <-- 33.10.31.33 and 89.99.11.22 

請幫我:)

規則:

  • 第一次忽略ipaddr ESS訪問

  • 對不起按日期分組我的英語不好

+2

你有什麼到目前爲止已經試過,顯示它 – Rafee 2014-09-30 09:04:37

+1

@DanFromGermany我認爲它應該反映 – sebastian 2014-09-30 09:05:32

+0

@DanFromGermany「按日期不同的IP地址」:看來,它的每 – WojtekT 2014-09-30 09:05:52

回答

2

總結,只計算不同的IP地址:如果你想看到的地址

SELECT 
    COUNT(DISTINCT t1.ip_address), 
    t1.date 
FROM table t1 
WHERE NOT EXISTS(
    SELECT ip_address 
    FROM table 
    WHERE t1.ip_address = t2.ip_address AND t1.date < t2.date 
    LIMIT 1) 
GROUP BY t1.date 
ORDER BY t1.date 

SELECT 
    COUNT(DISTINCT ip_address), 
    date, 
    GROUP_CONCAT(DISTINCT ip_address) 
FROM table 
GROUP BY date 
+0

不會,它會按日期顯示所有獨特的ip。我想要的是,第一次計算ip地址訪問:) – 2014-09-30 09:09:56

+0

@OrangeRDev更新 – DanFromGermany 2014-09-30 09:13:47

+0

不幸的是,它返回錯誤的結果。這裏是真正的表http://prntscr.com/4rpf9p 和使用你的代碼,結果是這樣的,http://prntscr.com/4rpfkf 實際上它應該是 1 | 2014-07-01 1 | 2014-08-01 2 | 2014-09-29 無論如何,謝謝你的幫助:) – 2014-09-30 09:35:29

1

從@DanFromgermany精煉答案

SELECT 
    COUNT(DISTINCT ip_address), 
    date 
FROM table t1 
where ip_address not in (select ip_address from table t2 where t2.date < t1.date) 
GROUP BY date 
+0

我覺得這更接近OP想要的東西。也許而不是IN,'WHERE NOT EXISTS(SELECT ip_address FROM table ... LIMIT 1)' – DanFromGermany 2014-09-30 09:10:59

+0

你說得對,它必須更高效。 – StephaneM 2014-09-30 09:12:56

0
SELECT ip_address, MIN(`date`), COUNT(DISTINCT `date`) 
FROM `table` 
GROUP BY ip_address; 

(順便說一句,它幾乎總是一個壞主意來存儲爲點分四組串IP地址)

如果IP地址的數量是相對小的記錄數(小於2%,這取決於在表和索引結構上),那麼NOT EXISTS子語將比這裏描述的全表掃描更高效。