首页 > 解决方案 > 从表创建 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       |
+------+------------+-------------+-------------+

提前致谢

标签: mysqlsqlview

解决方案


您可以取消透视和聚合:

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视图子句中的子查询。令人高兴的是,该限制不再有效。


推荐阅读