使用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有两个不同的入口点,我想忽略这些行。
答案 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;