MySQL在记分板的多个数据集中排名

时间:2016-03-22 22:30:55

标签: 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":

获得med rank
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

或者甚至根据不同的wod中的组合排名对事件进行总计,例如:

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

1 个答案:

答案 0 :(得分:0)

您可以使用以下查询:

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