如何查询拥有全部品类物品的用户ID?(动态物品场景)
嗨,我来帮你搞定这个SQL问题!你的核心痛点是不想硬编码物品品类的数量,毕竟品类随时会变,总不能每次都改SQL里的数字对吧?下面给你两种通用的解决方案,不管品类数量怎么变都能正常工作:
动态匹配所有物品品类的用户查询方案
方法一:子查询动态获取总品类数
这是最直接的写法,用子查询自动算出当前表中所有唯一物品的数量,再和每个用户拥有的品类数做对比:
SELECT user_id FROM Information GROUP BY user_id HAVING COUNT(DISTINCT item) = (SELECT COUNT(DISTINCT item) FROM Information);
为啥这个能行?
- 子查询
(SELECT COUNT(DISTINCT item) FROM Information)会实时统计表中所有不同的物品品类数量,不用你手动去数或者改数字。 - 先按
user_id分组,统计每个用户手里有多少种不同的物品(COUNT(DISTINCT item))。 - 最后用
HAVING过滤出那些拥有的品类数和总品类数相等的用户,这些就是拥有所有品类物品的人。
用你的示例数据测试的话,总品类数是4,user_id=2刚好拥有4种,所以会被筛选出来,完全符合你的预期。要是之后品类变成3种,这个SQL也会自动适配,不用做任何修改。
方法二:用CTE(公共表表达式)更清晰地拆分逻辑
如果你的数据库支持CTE(比如MySQL 8+、PostgreSQL、SQL Server这些),可以把总品类数单独拎出来,让SQL逻辑更易懂:
WITH total_categories AS ( -- 先算出所有唯一物品的总数 SELECT COUNT(DISTINCT item) AS total FROM Information ) SELECT DISTINCT user_id FROM Information, total_categories GROUP BY user_id, total_categories.total HAVING COUNT(DISTINCT item) = total_categories.total;
这个写法和第一种本质上是一样的,只是把计算总品类数的部分单独放在CTE里,可读性更好,适合复杂一点的场景。
内容的提问来源于stack exchange,提问作者inspire
相关产品推荐
相关产品推荐

