Несколько COUNT на одном столе - PullRequest
2 голосов
/ 29 марта 2020

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

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

на самом деле у меня есть больше столбцов в таблице, но они не связаны, но, пожалуйста, учтите, что

Учитывая winnerId, loserId и gameId, я хотел бы получить общее количество очки (количество побед) игроков-победителей и проигравших друг против друга

Пример ввода запроса:

winnerId:user1
loserId:user2
gameId:1

Результат:

   --userId--totalScore--
       user1      2           
       user2      1

Ответы [ 2 ]

3 голосов
/ 29 марта 2020

Выберите строки, где два игрока играли друг против друга. Затем подсчитайте количество строк на каждого победителя в игре:

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

Демо: https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=976df92c9706c08d34a1c372735efa4c

РЕДАКТИРОВАТЬ: Если один из игроков никогда выиграл у другого, не будет ряда для подсчета. Если вы хотите увидеть результирующую строку с нулевым счетом в этом случае, то сначала вы должны создать строку. Одним из способов является это:

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;
0 голосов
/ 29 марта 2020

Звучит как агрегация и фильтрация:

select winnerId as userId, count(*) as num_wins
from t
where ? in (winnerId, loserId) and
      ? in (winnerId, loserId) and
      gameId = ?
group by winnerId
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...