MySQL 在记分牌的多个数据集上排名

标签 mysql

我正在尝试为多项目比赛建立记分牌。

我有一个包含这样数据的表:

id competitor  wod score
1  Noah Ohlsen 01  350
2  Noah Ohlsen 02  430
3  Noah Ohlsen 03  140
4  Noah Ohlsen 04  314

我有一个 SQL 查询,它根据“wod”获得医学排名:

SELECT 
    competitor, 

    FIND_IN_SET( score, (
        SELECT GROUP_CONCAT( score
        ORDER BY score DESC ) 
        FROM wodcomp.scoring WHERE wod='01' )
        ) AS wod01,

    FIND_IN_SET( score, (
        SELECT GROUP_CONCAT( score
        ORDER BY score DESC ) 
        FROM wodcomp.scoring WHERE wod='02' )
        ) AS wod02,

    FIND_IN_SET( score, (
        SELECT GROUP_CONCAT( score
        ORDER BY score DESC ) 
        FROM wodcomp.scoring WHERE wod='03' )
        ) AS wod03,

    FIND_IN_SET( score, (
        SELECT GROUP_CONCAT( score
        ORDER BY score DESC ) 
        FROM wodcomp.scoring WHERE wod='04' )
        ) AS wod04
FROM 
    wodcomp.scoring competitor;

结果是:

Competitor  wod01 wod02 wod03 wod04
Noah Ohlsen 1     0     0     0
Noah Ohlsen 0     1     0     0
Noah Ohlsen 0     0     1     0
Noah Ohlsen 0     0     0     1

我希望它是一个组合行:

Competitor  wod01 wod02 wod03 wod04
Noah Ohlsen 1     1     1     1

或者甚至根据不同世界中的综合排名对所有事件进行总计,如下所示:

Competitor  wod01 wod02 wod03 wod04 wodtotal
Noah Ohlsen 1     1     1     1     1

最佳答案

您可以使用以下查询:

SELECT competitor, 
       FIND_IN_SET( MAX(CASE WHEN wod='01' THEN score END), 
                    (SELECT GROUP_CONCAT( score ORDER BY score DESC ) 
                     FROM scoring WHERE wod = '01' )) AS wod01,
       FIND_IN_SET( MAX(CASE WHEN wod='02' THEN score END), 
                    (SELECT GROUP_CONCAT( score ORDER BY score DESC ) 
                     FROM scoring WHERE wod = '02' )) AS wod02,
       FIND_IN_SET( MAX(CASE WHEN wod='03' THEN score END), 
                    (SELECT GROUP_CONCAT( score ORDER BY score DESC ) 
                     FROM scoring WHERE wod = '03' )) AS wod03,
       FIND_IN_SET( MAX(CASE WHEN wod='04' THEN score END), 
                    (SELECT GROUP_CONCAT( score ORDER BY score DESC ) 
                     FROM scoring WHERE wod = '04' )) AS wod04,
       FIND_IN_SET( SUM(score), 
                    (SELECT GROUP_CONCAT(total_score ORDER BY total_score DESC)
                     FROM (SELECT SUM(score) AS total_score
                           FROM scoring
                           GROUP BY competitor) AS t)) AS wod                     
FROM scoring 
GROUP BY competitor

Demo here

关于MySQL 在记分牌的多个数据集上排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36166479/

相关文章:

c# - mysql C# 中列标题中的特殊字符

mysql - 从组中选择最旧的两条记录

java - JSP中IF语句执行错误

mysql - SQL Plus 如果同一帐户没有两个不同的结果,如何只显示行

php - 递归php类别树扩展

PHP li值在sql查询中使用

java - 这段代码有什么错误?数据库中发现重复记录。

php - 自定义搜索引擎查询返回 false phpMyAdmin

java - [SQL]如何在一个 SELECT 中填充具有另一个表列表的对象?

java - 获取用户输入以创建 mysql 数据库