mysql - 从表创建 Medalist MySQL 视图
问题描述
我需要帮助才能在 MySQL 中创建视图。
我有一张以比赛名义的表格,如下所示:
+---------+-----+-----+-----+
|id| name |rank1|rank2|rank3|
+--+------+-----+-----+-----+
| 1| cmpt1| 4 | 3 | 9 |
| 2| cmpt2| 3 | 7 | 8 |
| 3| cmpt3| 4 | 1 | 2 |
| 4| cmpt4| 5 | 8 | 4 |
| 5| cmpt5| 9 | 3 | 2 |
| 6| cmpt6| 1 | 8 | 2 |
+--+------+-----+-----+-----+
rank1,2,3 值是指在比赛结束时拥有该排名的玩家 ID。
现在我想创建一个 MySQL 视图来显示每个玩家的总奖牌。第一、二、三名分别获得金、银、铜牌。
视图的输出将如下表所示:
+------+------------+-------------+-------------+
|player| gold_medals|silver_medals|bronze_medals|
+------+------------+-------------+-------------+
| 1 | 4 | 7 | 1 |
| 2 | 7 | 0 | 9 |
| 3 | 1 | 4 | 6 |
| 4 | 0 | 2 | 8 |
| 5 | 2 | 8 | 0 |
| 6 | 3 | 1 | 1 |
+------+------------+-------------+-------------+
提前致谢
解决方案
您可以取消透视和聚合:
select playerid,
sum(ranking = 1) as num_gold,
sum(ranking = 2) as num_silver,
sum(ranking = 3) as num_bronze
from ((select rank1 as playerid, 1 as ranking
from ranks
) union all
(select rank2, 2 as ranking
from ranks
) union all
(select rank3, 3 as ranking
from ranks
)
) p
group by playerid;
注意:这仅包括有排名的玩家。您的问题不包括所有玩家的来源,所以这似乎足够了。
这是一个 db<>fiddle。
请注意,旧版本的 MySQL(我认为是 5.7 之前的版本)不支持FROM
视图子句中的子查询。令人高兴的是,该限制不再有效。
推荐阅读
- c++ - 如何停止命令缓冲区之间的清除?
- php - 如果我收到错误 403,我的网站是否容易受到 SQL 注入的影响?
- javascript - 正则表达式没有正确捕获?
- github - AWS CodePipeline github webhook 未在提交时触发
- ckeditor - TYPO3 CKEditor:防止删除两个 HTML 标记之间的空格
- asp.net - 选择框中选定项目的 Asp.net 核心值为 0
- electron - 如何从电子应用程序中删除菜单栏
- javascript - 使用 Discord Bot 查找有效链接
- git - 如何使用我自己的 diff 工具和 `add --patch` 之类的?
- vmware - kubctl 不从公共注册表中提取图像,但 docker pull 有效