2014-09-30 82 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子语将比这里描述的全表扫描更高效。