我在根据单个结果表创建和排序排行榜时遇到问题。这是我正在尝试做的一个简单示例;
table results;
Name RaceNo Time
Sam 1 34
Ben 1 27
Sam 2 29
Ken 1 30
Ben 2 32
Sam 3 35
Ken 2 33
Ken 3 38
Ben 3 33
RaceNo=最多16个左右; 名称 = 最多 50 个左右;
我想得到如下排序的输出; 包含比赛行的输出,按总计排序
Name R1 R2 R3 Total(sum R1-n)
Ben 27 32 33 92
Sam 34 29 35 98
Ken 30 33 38 101
我真正想要的是; 期望的输出是每个比赛排名 1-n,以及 sum(Rank),其中行按 sum(Rank) 排序。
Name Rnk1 Rnk2 Rnk3 Total(sum Rank1-n)
Ben 1 2 1 4
Sam 3 1 2 6
Ken 2 3 3 8
我不知道如何解决这个问题。以下将对单个种族进行排名,但我不知道如何将所有种族串在一起到单个查询中。
select Name, find_in_set( Time, (select group_concat(Time order by Time) from
results where RaceNo=1)) as rank from results where RaceNo=1;
这离我想要做的还很远。我正在考虑在 PHP 中循环,但我确信在 MySQL 中有更好的方法。 如果有人可以提供帮助,我将非常感激?
最佳答案
你已经完成了最大的部分:
这样,您就可以在一个平面列中拥有所有排名
SELECT RaceNo, Name,
FIND_IN_SET( Time,
(SELECT GROUP_CONCAT(Time order by Time)
FROM results WHERE RaceNo=m1.RaceNo)) as rank
FROM results m1;
您只需更进一步即可获得特定比赛:
SELECT m2.Name, SUM(IF(m2.RaceNo=1, m2.rank, 0)) R1
FROM (SELECT RaceNo, Name, FIND_IN_SET( Time,
(SELECT GROUP_CONCAT(Time order by Time)
FROM results
WHERE RaceNo=m1.RaceNo)) as rank
FROM results m1) m2 GROUP BY m2.Name;
因此,您可以执行以下操作生成所有比赛的查询
## generating the different columns
SELECT CONCAT(GROUP_CONCAT(
CONCAT("SUM(IF(m2.RaceNo=", RaceNo, ", m2.rank, 0)) R", RaceNo)),
", SUM(m2.rank) Total")
INTO @query
FROM (SELECT DISTINCT RaceNo FROM results ) m;
## inserting the columns in our previous request
SELECT CONCAT("SELECT m2.Name, ", @query,
" FROM (SELECT RaceNo, Name, FIND_IN_SET( Time,
(SELECT GROUP_CONCAT(Time order by Time)
FROM results WHERE RaceNo=m1.RaceNo)) as rank
FROM results m1) m2 GROUP BY m2.Name;")
INTO @query;
## execute it as a statement
mysql> PREPARE stmt FROM @query;
mysql> EXECUTE stmt;
+------+------+------+------+-------+
| Name | R1 | R2 | R3 | Total |
+------+------+------+------+-------+
| Ben | 1 | 2 | 1 | 4 |
| Ken | 2 | 3 | 3 | 8 |
| Sam | 3 | 1 | 2 | 6 |
+------+------+------+------+-------+
3 rows in set (0.00 sec)
关于mysql - 如何按多个等级对表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28623922/