首页 > 解决方案 > SQL 查询与给定消费者拥有的每个集合集的数量有关

问题描述

假设我有客户可以获得某些奖品:

SELECT gs.claimed_by AS consumer_id, p.prize_id AS prize_id FROM 
  awarded_prizes

现在,客户 1 有三个奖品,客户 2 有一个奖品

+-------------+----------+
| consumer_id | prize_id |
+-------------+----------+
|           1 |       45 |
|           1 |       46 |
|           1 |       47 |
|           2 |       66 |
+-------------+----------+

假设我们也有收藏品,如果您收集该收藏品的所有成员,您现在就有了一个收藏品集:

SELECT set_id, member_prize_id AS prize_id FROM collectable_set_members;
+--------+----------+
| set_id | prize_id |
+--------+----------+
|      1 |       45 |
|      1 |       46 |
|      1 |       47 |
|      2 |       65 |
|      2 |       66 |
+--------+----------+

通过上表和前面的查询,我们可以看到客户 1 完成了 set 1 一次(他们有 45、46、47),而客户 2 什么也没完成。

在某些情况下,客户可以多次完成一组(客户可能有 45, 46, 47, 45, 46, 47 在award_prize 表中。

我一直在研究食品储藏室问题及其变体(如调酒师问题),一直在玩交叉连接和分组,但似乎找不到我想要的东西。

我正在尝试为给定客户获取结果,显示他们拥有的所有 set_ids 以及他们已完成的集合数:

+-------------+---------------+--------+
| consumer_id | completed_set |  count |
+-------------+---------------+--------+
|           1 |             1 |      1 |
+-------------+---------------+--------+ 

我在 mariadb:5.5

标签: mysqlsqlmariadb

解决方案


无法真正弄清楚您的最后一列“计数”应该是什么意思,但这是一个列出用户及其已完成集合的解决方案。

演示链接

整个想法是计算每套所需的奖品数量,并计算每套每位客户收集的奖品,因此您可以加入两者。

我知道它是 mssql,但我没有设法让 mysql ctes 在 sqfiddle 中工作。CTE-s 基本上只是一个子查询。如果您的服务器不支持 CTE-s,您可以改用普通子查询或临时表。


推荐阅读