首页 > 解决方案 > 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

有人可以帮忙吗?

标签: mysqlsubquery

解决方案


您可以使用以下解决方案,使用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'
);

dbfiddle.uk 上的演示


推荐阅读