假设我的客户可以获得某些奖励:
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完成了集合1一次(他们有45、46、47),而客户2什么也没有完成。
在某些情况下,客户可以多次完成一套内容(客户在奖励表中可以有45、46、47、45、46、47)。
我一直在研究食品储藏室问题及其变体(比如调酒师问题),一直在玩交叉连接和分组,似乎找不到我想要的东西。
我试图得到一个给定客户的结果,显示他们拥有的所有集合ID和他们完成的集合数量:
+-------------+---------------+--------+
| consumer_id | completed_set | count |
+-------------+---------------+--------+
| 1 | 1 | 1 |
+-------------+---------------+--------+
我在mariadb:5.5
3条答案
按热度按时间sshcrbum1#
看到这里了吗
我的table和你的名字不一样,但这证明了一点:
我的基本想法是把每套商品的数量和每一位消费者要求的每套商品的数量加起来。只要消费者和奖品对没有重复条目,这应该可以工作(如果允许重复,我将使用
count distinct(prize_id)
对于consumer_summary
).以上查询的输出为:
这将列出每对消费者和消费者至少有一个奖品的集合(要将其更改为列出每个使用者集组合,请使用
outer join
)在此基础上,只列出完整集或汇总完整集的数量应该很容易;-)
ibps3vxo2#
无法真正理解上一列“count”的含义,但这里有一个解决方案列出了用户及其完成的集合。
演示链接
整个想法是计算每套所需的奖品数量,并计算每套每一位顾客所获得的奖品,这样你就可以加入这两个行列。
我知道这是mssql,但我没有设法让mysql CTE在sqfiddle中工作。cte-s基本上只不过是一个子查询。如果您的服务器不支持cte-s,您可以改用普通子查询或临时表。
a8jjtwal3#
值得一提的是,我在SQLServer中为此提供了一个很好的例程。即使在每个集合中都有重叠的prize\u id值(如果不明确,则默认为更高的setid),这种方法仍然有效。假设所有临时表都是原始数据: