使用 PHP MySQL,我将用户的 IP 和他们输入的网站的 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”返回任何内容入口点”?那就是我希望它返回:
xxx.xxx.xxx.1 /index.php?source=google
如果我使用这 4 个 IP 在上面的 4 行上运行它。由于 xxx.xxx.xxx.5 有两个不同的入口点,我想忽略这些行。
最佳答案
您应该按 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;
关于php - Mysql 限制选择不共享列的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28705629/