选择MySQL结果,忽略计数大于X的字段

时间:2014-01-14 19:35:59

标签: mysql

我有以下MySQL表设置记录网站访问:

id   timestamp   ip   tracking
  • id =自动生成
  • timestamp =标准日期时间
  • ip = users ip address
  • 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

2 个答案:

答案 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;