我有一张桌子:
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的结果应该是:(金= 1,银= 0,铜=1)
Brian应该是:(黄金= 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`
)
银牌和铜牌似乎要难得多。
有谁有什么想法吗?
谢谢
编辑:澄清奖牌是如何授予的。
金牌:给游戏中得分最高的玩家。
银牌:给游戏中得分第二高的玩家。
铜牌:授予游戏中得分第三高的玩家。
多个游戏存储在表中。
如果有两名选手获得金牌,则不会获得银牌。两个最高分是平局,所以下一个最好的分数将是第三高分,因此将被授予铜牌。
发布于 2012-08-10 21:39:49
这将是有帮助的
如果需要,更新您的奖牌标准
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
发布于 2013-03-20 00:15:45
考虑一下这个例子。
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 |
+--------+------+--------+--------+
https://stackoverflow.com/questions/11902664
复制相似问题