【问题标题】:Creating Medalist MySQL view from a table从表中创建 Medalist MySQL 视图
【发布时间】:2021-06-30 14:12:21
【问题描述】:

我需要帮助才能在 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 视图来显示每个玩家的总奖牌。 1、2、3级分别获得金、银、铜牌。

视图的输出如下表:

+------+------------+-------------+-------------+
|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       |
+------+------------+-------------+-------------+

提前致谢

【问题讨论】:

  • 为什么玩家 7,8,9 没有在你想要的输出中?

标签: mysql sql view


【解决方案1】:

我假设你有另一个玩家名单:

select p.playerid 
 , count(case when playerid = rank1 then 1 end) gold_medals
 , count(case when playerid = rank2 then 1 end) silver_medals
 , count(case when playerid = rank3 then 1 end) bronze_medals
from 
players p 
left join ranks r
on p.playerid in (rank1, rank2, rank3)
group by p.playerid
玩家ID |金牌 |银牌|铜牌 --------: | ----------: | ------------: | ------------: 1 | 1 | 1 | 0 2 | 0 | 0 | 3 3 | 1 | 2 | 0 4 | 2 | 0 | 1 5 | 1 | 0 | 0 6 | 0 | 0 | 0 7 | 0 | 1 | 0 8 | 0 | 2 | 1 9 | 1 | 0 | 1

db小提琴here

【讨论】:

    【解决方案2】:

    您可以取消透视和聚合:

    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;
    

    注意:这仅包括有排名的玩家。您的问题不包括所有玩家的来源,所以这似乎足够了。

    Here 是一个 dbfiddle。

    请注意,旧版本的 MySQL(我认为是 5.7 之前的版本)不支持视图的 FROM 子句中的子查询。很高兴该限制不再有效。

    【讨论】:

      猜你喜欢
      • 2015-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多