mysql - 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
解决方案
无法真正弄清楚您的最后一列“计数”应该是什么意思,但这是一个列出用户及其已完成集合的解决方案。
整个想法是计算每套所需的奖品数量,并计算每套每位客户收集的奖品,因此您可以加入两者。
我知道它是 mssql,但我没有设法让 mysql ctes 在 sqfiddle 中工作。CTE-s 基本上只是一个子查询。如果您的服务器不支持 CTE-s,您可以改用普通子查询或临时表。
推荐阅读
- discord - Discord Bot 不会在频道中发送任何内容
- r - 在包开发期间查找未使用/“孤立”的非导出对象
- azure - 使用 for_each 创建不同数量的具有唯一 NIC 的 VM
- python - Django 过滤器 - 我想对上一个查询进行排序,而不是对整个模型进行排序
- asp.net - 文件上传并保存在 ASP.NET MVC 中的数据库中
- android - 在点击 Nativescript Angular + LineSeparator 颜色时删除 ListView 项目突出显示?
- wpf - .Net Core (WPF) 和单个 exe 中的应用程序设置
- java - 使用 javamail 将字符串作为附件发送会得到重复的内容
- javascript - 页面大小更改后丢失光标位置
- android - (Ionic 3) 后台模式插件停止 iOS 设备上媒体的后台播放