关系除法实现:计算用户完整卡牌套组拥有数量
卡牌套组统计的SQL实现方案
要解决筛选集齐SetA套组的用户并统计每人套组总数的问题,核心是结合单卡持有数量和套组卡牌需求计算,原SQL仅能判断用户是否集齐卡牌,但无法统计可凑出的套数,以下是调整后的方案:
核心思路
SetA套组默认每张卡牌需要1张(若套组有特殊数量要求可修改),用户能凑出的套组总数,等于该用户套组内所有卡牌持有量的最小值——比如用户AA有2张、BB有2张、CC有3张,最多能凑2套。
完整SQL代码
SELECT tc.User, FLOOR(MIN(tc.Quantity / cs.RequiredQty)) AS SetA套组总数 FROM Cards tc JOIN ( -- 提取SetA的卡牌构成及单卡需求数(默认1张,按需修改) SELECT Card, 1 AS RequiredQty FROM CardSets WHERE [Set] = 'SetA' ) cs ON tc.Card = cs.Card GROUP BY tc.User HAVING FLOOR(MIN(tc.Quantity / cs.RequiredQty)) >= 1;
代码说明
- 子查询先锁定SetA包含的所有卡牌,定义每张卡牌在套组中的需求数量(比如套组需要2张AA,就把
1改成2)。 - 关联Cards表后,用
FLOOR取整计算用户每张卡牌的持有量能支持多少套。 - 对每个用户取所有卡牌可支持套数的最小值,就是该用户最多能凑出的SetA套组总数。
HAVING子句筛选出至少能凑1套的用户,符合需求。
适配特殊场景
如果CardSets表本身就记录了套组中每张卡牌的需求数量(比如有RequiredQuantity字段),直接替换子查询里的1为该字段即可:
SELECT tc.User, FLOOR(MIN(tc.Quantity / cs.RequiredQuantity)) AS SetA套组总数 FROM Cards tc JOIN CardSets cs ON tc.Card = cs.Card AND cs.[Set] = 'SetA' GROUP BY tc.User HAVING FLOOR(MIN(tc.Quantity / cs.RequiredQuantity)) >= 1;
内容的提问来源于stack exchange,提问作者userStack
相关产品推荐
相关产品推荐

