Получить наибольшее значение из нескольких столбцов и связанных столбцов имен - PullRequest
0 голосов
/ 02 марта 2012

У меня есть таблица с этими столбцами:

id | player1_name | player1_score | player2_name | player2_score | player3_name | player3_score | player4_name | player4_score | player5_name | player5_score

При наличии одной строки, как мне получить самое высокое playerX_score и соответствующее playerX_name?

IЯ пытался использовать GREATEST(), но я не могу получить playerX_name.

Ответы [ 2 ]

1 голос
/ 02 марта 2012

Кроме того, я думаю, что ваш стол был бы лучше оформлен как id | name | score | position | teamid, где position идет от 1 до 5, а teamid служит для объединения всех в одной команде.Это значительно упростит запрос такого типа (наибольшее количество очков на команду со связанными строками).

Однако, есть один способ сделать то, что вы хотите с вашей текущей таблицей:

SELECT GREATEST(player1_score,player2_score,player3_score,
                player4_score,player5_score) as score,
       CASE GREATEST(...) -- repeat the above
         WHEN player1_score then player1_name
         WHEN player2_score then player2_name
         WHEN player3_score then player3_name
         WHEN player4_score then player4_name
         WHEN player5_score then player5_name
       END as name
FROM mytable
0 голосов
/ 02 марта 2012

Я думаю, что ваша структура таблицы не подходит для того, что вы пытаетесь сделать. Вы хотите, чтобы база данных знала, что есть некоторая связь между player1_name и player1_score, но она не закодирована в таблице. Изменение, которое сделало бы это намного проще, состояло бы в том, чтобы дать каждому игроку свою собственную запись и использовать то, что вы в настоящее время называете id (который я предполагаю, является идентификатором для конкретной игры), чтобы указать, какие игроки идут вместе.

Это будет выглядеть так:

game_id  | player_num | player_name | score
1        | 1          | Octern      | 100
1        | 2          | Boris       | 400
1        | 3          | Jarlsberg   | 300
1        | 4          | Pete        | 40000
...

Затем, чтобы найти рекордсмен для данной игры (в данном случае игра № 1), вы скажете:

select player_name from scores
    WHERE game_id = 1
    ORDER BY score desc
    LIMIT 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...