mysql - 跨行的 SQL 检查
问题描述
假设我在下面有一个表结构。我只想找到那些只发出 HEAD 请求的 IP。在这种情况下,IP6。
mysql> select distinct ip, method from request_records;
+-------+---------+
| ip | method |
+-------+---------+
| IP1 | GET |
| IP1 | POST |
| IP1 | OPTIONS |
| IP1 | HEAD |
| IP2 | GET |
| IP2 | POST |
| IP2 | OPTIONS |
| IP2 | HEAD |
| IP3 | GET |
| IP4 | POST |
| IP5 | OPTIONS |
| IP6 | HEAD |
+-------+---------+
使用 NOT IN 条件会返回其他不正确的 IP(见下文)。如何检查多行
mysql> select distinct ip,method from request_records where method not in ('GET','POST','OPTIONS');
+-------+-------+
| ip | method |
+-------+-------+
| IP1 | HEAD |
| IP2 | HEAD |
| IP6 | HEAD |
+-------+-------+
解决方案
您可以使用聚合:
select ip
from request_records
group by ip
having min(request) = max(request) and min(request) = 'HEAD';
如果您有一个单独的唯一表ip
,那么我建议not exists
:
select ip
from ips
where not exists (select 1
from request_record rr
where rr.ip = ips.ip and
rr.request <> 'HEAD'
);
当然,这将返回没有'HEAD'
-- 这可能是您想要的也可能不是您想要的行。你可以加:
select ip
from ips
where not exists (select 1
from request_record rr
where rr.ip = ips.ip and
rr.request <> 'HEAD'
) and
exists (select 1
from request_record rr
where rr.ip = ips.ip and
rr.request = 'HEAD'
);
推荐阅读
- macos - 带有 $npm_package 的 npm 脚本在文件夹中,路径中有空格
- python - 从 pandas DataFrame 或 Series 插值到新的 DatetimeIndex
- java - 如何修复 nextLine 错误以便打印两个单词?
- opengl-es - 着色器版本更改时 gl_PointSize 需要扩展
- java - 如何等待毕加索在 Android 中完成加载图像?
- android - Android Studio:无法将华为设备连接到 Android Studio?
- python - 从分布生成随机字节数组
- html - 我正在尝试在 html、css 中创建一个简单的进度条。但是我的 div 是重叠的
- python - 具有多个输入和输出的自定义损失函数
- wordpress - Wordpress:将自定义参数添加到所有 URL