Ma table contient des informations de cette façon:

Player_ID | isWinner

PlayerID est l'ID du joueur et isWinner est un booléen (0 pour perdre, 1 pour gagner).

Le même Player_ID peut être sur plusieurs lignes.

Mon objectif est de faire une requête pour obtenir TOUTES les informations de cette table classées par les joueurs, du taux de gain le plus élevé (%) au plus bas.

Exemple de données:

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

La requête classera ces données de cette façon:

  • 1 | 100% -> l'ID de joueur 1 a le taux de victoire le plus élevé
  • 2 | 33% -> le joueur ID 2 a le 2ème taux de victoire
  • 3 | 0% -> l'ID de joueur 3 a le taux de victoire le plus bas

Je dois probablement grouper par player_id et calculer en quelque sorte le SUM de isWinner de chaque joueur, puis le diviser par le nombre d'enregistrements.

Des idées?

1
AndroidWonderer 5 janv. 2016 à 20:21

2 réponses

Meilleure réponse

Vous pouvez utiliser avg() pour trouver la moyenne des gains totaux pour chaque joueur, puis multiplier par 100 pour donner le pourcentage

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

Voir fiddle: http://sqlfiddle.com/#!9/ 10f797 / 1

enter image description here

1
ʰᵈˑ 5 janv. 2016 à 17:32

Cette requête renverra la moyenne pour chaque joueur:

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

Alors vous pouvez joindre votre table avec cette sous-requête:

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

Veuillez consulter un violon ici.

1
fthiella 5 janv. 2016 à 17:27