Multiple même table sur COUNT

lastp4:

J'ai une table:

   +----------+-----------+----------+--------+
    | id       |  winnerId | loserId  | gameId |
    +----------+-----------+----------+--------+
    | 1        | user1     | user2    |      1 |
    | 2        | user2     | user1    |      1 |
    | 3        | user1     | user2    |      1 |
    | 4        | user1     | user2    |      2 |
      5          user1       user3           1
    +----------+-----------+----------+--------+

en fait, j'ai plusieurs colonnes dans la table mais ils sont unreleated, mais s'il vous plaît considérer que

Étant donné winnerId, loserId et gameid je voudrais obtenir des scores totaux (gagner nombre) des joueurs de gagnant et perdant les uns contre les autres

Exemple d'entrée de requête:

winnerId:user1
loserId:user2
gameId:1

Résultat:

   --userId--totalScore--
       user1      2           
       user2      1
Thorsten Kettner:

Sélectionnez les lignes où les deux joueurs ont joué les uns contre les autres. Comptez ensuite les lignes par gagnant pour le jeu:

select winnerid, count(*) 
from mytable
where gameid = 1
and (winnerid, loserid) in ((1,2), (2,1))
group by winnerid;

Démo: https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=976df92c9706c08d34a1c372735efa4c

EDIT: Si l' un des joueurs n'a jamais gagné contre l'autre, il n'y aura pas de ligne à compter. Si vous voulez voir une ligne de résultat avec un nombre de zéro dans ce cas, vous devez d' abord créer une ligne. Une façon est la suivante:

select playerid, sum(won) 
from 
(
  select winnerid as playerid, 1 as won
  from mytable
  where gameid = 1
  and (winnerid, loserid) in ((1,2), (2,1))
  union all 
  select loserid as playerid, 0 as won
  from mytable
  where gameid = 1
  and (winnerid, loserid) in ((1,2), (2,1))
)
group by playerid
order by playerid;

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=373110&siteId=1
conseillé
Classement