我有以下MySQL表设置记录网站访问:
id timestamp ip tracking
此跟踪的目的是在运行此脚本的情况下将各种转发域发送到此站点。该脚本记录ip和时间戳,并从URL中获取跟踪代码。
我们要做的就是使用所有跟踪代码的汇总计数,但是,有很多垃圾邮件请求(机器人)访问该网站。我试图找出滤除我认为是机器人的结果的最佳方法,我不希望它们计入最终结果中。
我最初的想法是先过滤掉多次出现的所有ips。我的问题是,如何使用该查询的结果返回并计算跟踪代码?
我过滤仅显示一次的ips的代码是:
SELECT tracking, ip, COUNT( * )
FROM tracking
GROUP BY ip
HAVING COUNT( * ) =1
ORDER BY COUNT( * ) DESC
如何获取这些结果并运行另一个查询,然后计算并总结跟踪代码?
-Kevin
修改
对不起,首先发帖在这里,我冲了一下。最后,我正在寻找的是获取所有使用的跟踪代码的数量。
假设我有以下表数据:
id timestamp ip tracking
-- --------- -- --------
1 2014-01-10 23:43:10 192.168.1.1 100
2 2014-01-10 23:43:10 192.168.1.1 200
3 2014-01-10 23:43:10 192.168.1.2 100
4 2014-01-10 23:43:10 192.168.1.1 999
5 2014-01-10 23:43:10 192.168.1.1 100
6 2014-01-12 23:43:10 192.168.1.1 100
7 2014-01-12 23:43:10 192.168.1.3 100
8 2014-01-12 23:43:10 192.168.1.4 100
9 2014-01-12 23:43:10 192.168.1.5 600
10 2014-01-12 23:43:10 192.168.1.1 888
11 2014-01-12 23:43:10 192.168.1.1 888
12 2014-01-12 23:43:10 192.168.1.8 200
13 2014-01-12 23:43:10 192.168.1.9 300
14 2014-01-12 23:43:10 192.168.1.10 100
15 2014-01-12 23:43:10 192.168.1.11 400
16 2014-01-12 23:43:10 192.168.1.1 888
17 2014-01-12 23:43:10 192.168.1.12 200
18 2014-01-12 23:43:10 192.168.1.2 777
19 2014-01-12 23:43:10 192.168.1.2 100
20 2014-01-12 23:43:10 192.168.1.1 200
21 2014-01-12 23:43:10 192.168.1.4 789
最后,我想显示所使用的所有跟踪代码的计数,但要忽略任何IP地址看起来来自机器人的行。由于这种设置的性质,我们假设IP地址只会打到一次,也许两次。所以我想,如果我能得到跟踪代码的数量,则排除ip地址大于1(或者可能是2)的任何行。
因此该数据集的最终结果将是
tracking count
-------- -----
100 3
200 2
300 1
400 1
600 1
789 1
基本上从结果来看,我们没有计算192.168.1.1和192.168.1.2中的任何内容,因为那些ips访问了超过1次。
编辑 - 我添加了第21行,让其中一个IP访问两次,因此如果我们在查询中使用< 3,则他们的访问都应该计算。看起来以下答案无法正常工作。当我添加第21行时,代码789不会被计算
希望这有助于更好地理解它?
我知道如何获得ips或跟踪的整体计数,但我无法弄清楚如何将两者放在一个查询中。
-Kevin
编辑2/4/14 - 所以我认为正在发生的是下面的查询仅计算IP的第一个实例的跟踪代码。因此,在这种情况下,让我们更改表格以获得更好的数据集
id timestamp ip tracking
-- --------- -- --------
1 2014-01-10 23:43:10 192.168.1.1 100
2 2014-01-10 23:43:10 192.168.1.222 100
3 2014-01-10 23:43:10 192.168.1.1 200
4 2014-01-10 23:43:10 192.168.1.2 100
5 2014-01-10 23:43:10 192.168.1.1 999
6 2014-01-12 23:43:10 192.168.1.1 100
7 2014-01-12 23:43:10 192.168.1.2 100
8 2014-01-12 23:43:10 192.168.1.3 100
9 2014-01-12 23:43:10 192.168.1.4 100
10 2014-01-12 23:43:10 192.168.1.5 600
11 2014-01-12 23:43:10 192.168.1.1 888
12 2014-01-12 23:43:10 192.168.1.1 888
13 2014-01-12 23:43:10 192.168.1.8 200
14 2014-01-12 23:43:10 192.168.1.9 300
15 2014-01-12 23:43:10 192.168.1.10 100
16 2014-01-12 23:43:10 192.168.1.11 400
17 2014-01-12 23:43:10 192.168.1.1 888
18 2014-01-12 23:43:10 192.168.1.12 200
19 2014-01-12 23:43:10 192.168.1.222 777
20 2014-01-12 23:43:10 192.168.1.2 100
21 2014-01-12 23:43:10 192.168.1.1 200
22 2014-01-12 23:43:10 192.168.1.4 789
在这种情况下,我希望查询是任何IP出现2次或更少次的地方。所以结果应该是:
tracking count
-------- -----
100 4
200 2
300 1
400 1
600 1
777 1
789 1
基本上,192.168.1.1和.2是唯一出现超过2次的,因此应排除它们。一些IP,如.4和.222出现两次,这很好,但每次使用不同的代码。
使用以下查询:
select xyz.tracking,count(xyz.tracking) as `count` from (select ip,count(ip),tracking from tracking group by ip having count(ip)<3) xyz group by xyz.tracking;
我似乎只拿起每个IP的第一个实例的代码。所以我得到的结果是:
tracking count
-------- -----
100 4
200 2
300 1
400 1
600 1
所以在这种情况下,它正在为IP .222获取代码100,而不是为IP获取代码777 .222 它正在为IP .4而不是代码789获取IP .4。
任何人都有任何想法如何解决这个问题?
编辑:所以我认为我有一个解决方案。它返回正确的值。有人可以验证吗?
SELECT t.tracking, count(t.tracking) as COUNT FROM tracking t
JOIN (
SELECT s.ip, count(s.ip) FROM tracking s GROUP BY s.ip HAVING COUNT(s.ip)<=2) d
ON d.ip = t.ip
GROUP BY t.tracking
答案 0 :(得分:1)
我相信我找到了答案,以防其他人需要这样的查询。
SELECT t.tracking, count(t.tracking) as COUNT FROM tracking t
JOIN (
SELECT s.ip, count(s.ip) FROM tracking s GROUP BY s.ip HAVING COUNT(s.ip)<=2) d
ON d.ip = t.ip
GROUP BY t.tracking
答案 1 :(得分:0)
试试这个:
select xyz.tracking,count(xyz.tracking) as `count` from (select ip,count(ip),tracking from tracking group by ip having count(ip)<3) xyz group by xyz.tracking;