【问题标题】:MySQL: Counting gold, silver and bronze medals for a playerMySQL:计算球员的金牌、银牌和铜牌
【发布时间】:2025-12-12 19:50:01
【问题描述】:

我有这张桌子:

id  game  points  player
---|-----|-------|--------
1  | 1   | 6     | John   
2  | 1   | 5     | Adam
3  | 1   | 7     | Brian
4  | 1   | 8     | Alan
5  | 2   | 6     | John   
6  | 2   | 2     | Adam
7  | 2   | 4     | Brian
8  | 2   | 3     | Alan

我正在尝试编写一个查询来计算一个人赢得了多少金、银和铜牌。

Alan 的结果应该是:( [gold] = 1, [silver] = 0, [bronze] = 1)

布赖恩应该是:([金] = 0,[银] = 2,[铜] = 0)

我已经可以这样数金牌数了:

SELECT COUNT(*) AS gold
FROM (`myTable` AS t)
WHERE `t`.`player` = 'Alan'
AND `t`.points = (
    SELECT MAX(`points`)
    FROM `myTable` as tsub
    WHERE `tsub`.`game` = `t`.`game`
)

银牌和铜牌似乎要困难得多。

有人有什么想法吗?

谢谢

编辑: 澄清奖牌的授予方式。

金币:授予游戏中得分最高的玩家。

银牌:奖励给比赛中得分第二高的玩家。

铜牌:比赛中得分第三高的玩家。

多个游戏存储在表中。

如果有两名选手获得金牌,则不会获得银牌。 两个最高分打成平手,因此次高分将是第三高分,因此将获得铜牌。

【问题讨论】:

  • 金、银、铜各得多少分?
  • 出现平局时会发生什么?
  • 如果该人在游戏中得分最高,则获得金牌。第二高分 = 银牌,依此类推。关于平局:如果两名球员得分最高,他们都将获得金牌,得分第三高的球员应该获得铜牌。

标签: mysql subquery


【解决方案1】:

这会很有帮助

如果需要,更新您的奖牌标准

select 
name, 
(SELECT count(*) FROM myTable g where g.points > 5 and g.name=myTable.name) as gold,
(SELECT count(*) FROM myTable g where g.points > 2 and g.points <= 5 and g.name=myTable.name) as silver,
(SELECT count(*) FROM myTable g where g.points <= 2 and g.name=myTable.name) as gold
from myTable
group by name

【讨论】:

  • 恐怕这不会有多大帮助。我已经编辑了我的问题,以阐明应该如何授予奖牌。
【解决方案2】:

考虑这个例子...

 DROP TABLE IF EXISTS my_table;

 CREATE TABLE my_table 
 (game INT NOT NULL
 ,points INT NOT NULL
 ,player VARCHAR(12) NOT NULL
 ,PRIMARY KEY(game,player)
 );

 INSERT INTO my_table VALUES
 (1,6,'John'),
 (1,5,'Adam'),
 (1,7,'Brian'),
 (1,8,'Alan'),
 (2,6,'John'),
 (2,2,'Adam'),
 (2,4,'Brian'),
 (2,3,'Alan');

 SELECT player
      , SUM(rank=1) gold
      , SUM(rank=2) silver
      , SUM(rank=3) bronze 
   FROM
      (
        SELECT x.*
             , COUNT(*) rank 
          FROM my_table x 
          JOIN my_table y 
            ON y.game = x.game 
           AND y.points >= x.points 
         GROUP 
            BY game
             , player
      ) a
  GROUP 
     BY player;
 +--------+------+--------+--------+
 | player | gold | silver | bronze |
 +--------+------+--------+--------+
 | Adam   |    0 |      0 |      0 |
 | Alan   |    1 |      0 |      1 |
 | Brian  |    0 |      2 |      0 |
 | John   |    1 |      0 |      1 |
 +--------+------+--------+--------+

【讨论】: