2016-01-05 2 views
1

Моя таблица содержит информацию так:MySQL Сортировка по выиграть шанс (%)

Player_ID | isWinner 

где PlayerID является идентификатор игрока, и isWinner является логическим (0 за проигрыш, 1 за победу).

То же самое Player_ID может быть в нескольких строках.

Моя цель - сделать запрос, чтобы получить ВСЕ информацию из этой таблицы, заказанную игроками, от наивысшей ставки выигрыша (%) до самой низкой. Пример

данных:

(Player_ID | isWinner) 
1 | 1 
1 | 1 
1 | 1 
2 | 0 
2 | 0 
2 | 1 
3 | 0 
3 | 0 
3 | 0 

Запрос будет заказать эти показания так:

  • 1 | 100% -> игрок ID 1 имеет самый высокий коэффициент выигрыша
  • 2 | 33% -> игрок ID 2 имеет 2-й выигрыш
  • 3 | 0% -> игрок ID 3 имеет самый низкий винрейт

Я, вероятно, к группе player_id и как-то вычислить SUM из isWinner каждого игрока, а затем разделить его на numebr записей.

Любые идеи?

+0

Это действительно '330%' выигрыш для игрока 2? –

ответ

1

Вы можете использовать avg(), чтобы найти среднее общей победы для каждого игрока, то мультипликатор на 100, чтобы дать процентное соотношение

select 
    player_id as pid, 
    avg(is_winner) * 100 as win_rate, 
    (
     SELECT 
      count(player_id) 
     FROM 
      `34617596` 
     WHERE 
      is_winner = 1 
     AND player_id = pid 
    ) AS total_wins 
FROM 
    `34617596` 
group by pid 
order by win_rate desc 

см скрипку:http://sqlfiddle.com/#!9/10f797/1

enter image description here

+0

Прохладный, он работает и хорошо написан, спасибо – AndroidWonderer

1

Этот запрос возвращает среднее значение для каждого игрока:

select player_id, avg(isWinner) as avg_is_winner 
from players 
group by player_id 

, то вы можете присоединиться к столу этого подзапроса:

select players.* 
from 
    players inner join (
    select player_id, avg(isWinner) as avg_is_winner 
    from players 
    group by player_id 
) c on players.player_id = c.player_id 
order by 
    avg_is_winner desc, 
    isWinner desc 

Пожалуйста, смотрите скрипку here.

Смежные вопросы