php - Mysql 限制选择不共享列的行

标签 php mysql

使用 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/

相关文章:

php - 仅使用 Sphinx 搜索引擎 (API-PHP) 进行通配符匹配和邻近度精确匹配

php - 插入借用特定 CD 的客户

mysql - MySQL 查询中 EXPLAIN、count(1) 和表内容之间的差异

MySql - 查询构造中的问题

php - 如何获得客户提交帖子的天数?

PHP - 特殊字符(欧元符号)未正确显示(RSS feed/SimplePie)

javascript - 如何上传图片并与帐户当前 session 的 'id'一起保存到数据库中

java - 为什么 php 页面在 LogCat 中不显示相同的内容?

java - mysql 到 sqoop - 连接被拒绝 : java.net.ConnectException

mysql - "select count(null)"和 "select count(1)"之间的区别