Mysql限制选择不共享列的行

时间:2015-02-24 20:27:42

标签: php mysql

使用PHP MySQL,我在数据库中存储用户的IP以及他们输入的我的网站。行看起来像:

ip              entrypoint
xxx.xxx.xxx.1   /index.php?source=google
xxx.xxx.xxx.5   /other.php?source=bing
xxx.xxx.xxx.5   /other.php?source=yahoo
xxx.xxx.xxx.4   /more.php

我正在尝试从表单中创建一个最多需要300个IP的查询,并搜索用户来自哪里,所以我从这开始(缩短为仅显示4个):

SELECT entrypoint,ip from TABLE WHERE ip IN('xxx.xxx.xxx.1','xxx.xxx.xxx.5','xxx.xxx.xxx.5','xxx.xxx.xxx.4') AND entrypoint LIKE '%source=%';

这给我一个结果:

ip              entrypoint
xxx.xxx.xxx.1   /index.php?source=google
xxx.xxx.xxx.5   /other.php?source=bing
xxx.xxx.xxx.5   /other.php?source=yahoo

由于代理,机器人等,有些IP有1,000多个条目,所以我无法使用他们的信息。如果给定IP有多个包含“source =”的“入口点”,我想忽略该行。它还使搜索大量的IP变得困难,因为如果我正在搜索其中一个IP并返回与之关联的所有行,那么我将在PHP中耗尽内存。

有没有一种方法可以编写查询,而不是让PHP完成分享IP的结果的工作,这样如果在“ip”中有多个值,它就不会为“ip”返回任何内容。入口点”?那就是我希望它回归:

xxx.xxx.xxx.1   /index.php?source=google

如果我使用这4个IP在上面的那4行上运行它。由于xxx.xxx.xxx.5有两个不同的入口点,我想忽略这些行。

1 个答案:

答案 0 :(得分:1)

你应该通过ip分组你的结果,计算区分入口点的数量,并返回带有1个入口点的那些

 SELECT entrypoint,ip, count(distinct entrypoint) nb
 from TABLE WHERE ip
      IN('xxx.xxx.xxx.1','xxx.xxx.xxx.5','xxx.xxx.xxx.5','xxx.xxx.xxx.4')
 AND entrypoint LIKE '%source=%' group by ip HAVING nb=1;