You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查询拥有全部品类物品的用户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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:35:54