mysql - MySQL 查询以选择仅选择一个类别的用户
问题描述
我有一个数据类似于下面的表
id UserId Category
1 5001 A
2 5001 B
3 5002 A
4 5003 B
5 5004 A
6 5001 A
1)我们如何查询可以获取仅注册A类别的用户的表。用户不应注册 B 或任何其他类别。对于上面的数据,它应该只返回我
3 5002 A
2)我们如何编写一个查询来获取同时注册了A和B类别的用户。不是一个人 A 不是一个人 B 对于以上,它应该只返回我
userId - 5001
有人可以帮忙吗?
解决方案
您可以使用以下解决方案,使用IN
:
SELECT DISTINCT UserID, Category
FROM table_name t
WHERE Category = 'A' AND UserID NOT IN (
SELECT UserID
FROM table_name
WHERE Category <> t.Category
);
另一种解决方案使用EXISTS
:
SELECT DISTINCT UserID, Category
FROM table_name t
WHERE Category = 'A' AND NOT EXISTS (
SELECT 1
FROM table_name
WHERE UserID = t.UserID AND Category <> t.Category
);
要获得第二个结果,您可以使用以下解决方案INNER JOIN
:
SELECT DISTINCT t.UserId
FROM table_name t INNER JOIN (
SELECT UserId
FROM table_name
WHERE Category = 'B'
) b ON t.UserId = b.UserId
WHERE t.Category = 'A'
另一种解决方案使用EXISTS
:
SELECT DISTINCT UserID
FROM table_name t
WHERE Category = 'A' AND EXISTS (
SELECT 1
FROM table_name
WHERE UserID = t.UserID AND Category = 'B'
);
推荐阅读
- php - Woocommerce 的 Flatsome:INC 文件夹中的 Annul 文件
- java - 错误消息:无法在“/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home/bin/apt”中找到可执行文件 (-1)
- rest - 基于 REST 的基于 HTTP 签名的 Web 服务安全性
- python - 使用烧瓶,第二次 send_file 以获取具有相同路径和名称的更改文件 - 缓存问题?
- c# - 如何更新应用程序中每个 .csproj 文件中的 ToolVersion
- php - Paypal Transaction API Getting Total 不是有效的数值
- python-3.x - Sublime Text 3 在“”中找不到“__main__”模块
- c++ - 如何将逗号分隔的 txt 文件流式传输到类对象?
- bash - How to write "#!/bin/sh" to script.sh through bash?
- javascript - 图片库 - 滑块