Mysql 计算一个值';s在两列中匹配,分别计数

Mysql 计算一个值';s在两列中匹配,分别计数,mysql,mariadb,Mysql,Mariadb,我有一张这样的表格(称为结果),上面有一场比赛的分数: id | Winner | Loser | Score ---+--------+-------+------ 1 Bob Joe 4 2 Roy Mary 3 3 Joe Roy 6 4 Mary Bob 1 5 Ellen Roy 9 6 José Roy 2 7 Joe Bob

我有一张这样的表格(称为结果),上面有一场比赛的分数:

id | Winner | Loser | Score
---+--------+-------+------
1    Bob      Joe     4
2    Roy      Mary    3
3    Joe      Roy     6
4    Mary     Bob     1
5    Ellen    Roy     9
6    José     Roy     2
7    Joe      Bob     7
我想做的是计算每个名字成为赢家的次数,以及他们成为输家的次数,然后按玩过的游戏数降序排列:

Name | Wins | Losses | NumberGames
-----+------+--------+------------
Roy    1     3         4
Bob    1     2         3
Joe    2     1         3
Mary   1     1         2
Ellen  1     0         1
José   1     0         1
更好的是,我想按赢的游戏百分比除以玩的游戏总数(赢加输)来排序

我不想硬编码任何名字,例如Winner=“Bob”

我知道如何构造一个查询来计算每个列的数量,但我还没有弄清楚如何创建3个不同的计数并按名称进行分组

我想做的是计算每个名字是一个数字的次数 胜利者,每次他们都是失败者,然后按顺序递减 玩的游戏数:

Name | Wins | Losses | NumberGames
-----+------+--------+------------
Roy    1     3         4
Bob    1     2         3
Joe    2     1         3
Mary   1     1         2
Ellen  1     0         1
José   1     0         1
此查询的工作方式是基于查询中的赢家和输家列生成唯一的名称列表

查询

SELECT
 DISTINCT
  Results.Winner AS name
 FROM 
  Results

UNION 

SELECT
 DISTINCT
  Results.Loser AS name
 FROM 
  Results 
SELECT
   Results_Wins_Losses.name
 , Results_Wins_Losses.Wins 
 , Results_Wins_Losses.Losses 
 , (Results_Wins_Losses.Wins + Results_Wins_Losses.Losses) AS NumberGames
FROM ( 

  SELECT 
     unique_result_names.name
   , (
      CASE
         WHEN results_wins.Wins IS NULL
         THEN 0
         ELSE results_wins.Wins
       END
      ) AS Wins 
   , (
      CASE
         WHEN results_losses.Losses IS NULL
         THEN 0
         ELSE results_losses.Losses
       END
      ) AS Losses   
  FROM ( 
    SELECT
     DISTINCT
      Results.Winner AS name
     FROM 
      Results

    UNION 

    SELECT
     DISTINCT
      Results.Loser AS name
     FROM 
      Results 

  ) AS unique_result_names

  LEFT JOIN (
    SELECT
       Results.Winner
     , COUNT(*) AS Wins
    FROM  
     Results
    GROUP BY
     Results.Winner
  ) AS results_wins 
  ON
   unique_result_names.name = results_wins.Winner

  LEFT JOIN (
    SELECT
       Results.Loser
     , COUNT(*) AS Losses
    FROM  
     Results
    GROUP BY
     Results.Loser
  ) AS results_losses
  ON
   unique_result_names.name = results_losses.Loser
) AS Results_Wins_Losses
ORDER BY 
 NumberGames DESC
左边是JOIN的唯一名单,上面有赢家和输家计数,以获得赢家和输家

查询

SELECT
 DISTINCT
  Results.Winner AS name
 FROM 
  Results

UNION 

SELECT
 DISTINCT
  Results.Loser AS name
 FROM 
  Results 
SELECT
   Results_Wins_Losses.name
 , Results_Wins_Losses.Wins 
 , Results_Wins_Losses.Losses 
 , (Results_Wins_Losses.Wins + Results_Wins_Losses.Losses) AS NumberGames
FROM ( 

  SELECT 
     unique_result_names.name
   , (
      CASE
         WHEN results_wins.Wins IS NULL
         THEN 0
         ELSE results_wins.Wins
       END
      ) AS Wins 
   , (
      CASE
         WHEN results_losses.Losses IS NULL
         THEN 0
         ELSE results_losses.Losses
       END
      ) AS Losses   
  FROM ( 
    SELECT
     DISTINCT
      Results.Winner AS name
     FROM 
      Results

    UNION 

    SELECT
     DISTINCT
      Results.Loser AS name
     FROM 
      Results 

  ) AS unique_result_names

  LEFT JOIN (
    SELECT
       Results.Winner
     , COUNT(*) AS Wins
    FROM  
     Results
    GROUP BY
     Results.Winner
  ) AS results_wins 
  ON
   unique_result_names.name = results_wins.Winner

  LEFT JOIN (
    SELECT
       Results.Loser
     , COUNT(*) AS Losses
    FROM  
     Results
    GROUP BY
     Results.Loser
  ) AS results_losses
  ON
   unique_result_names.name = results_losses.Loser
) AS Results_Wins_Losses
ORDER BY 
 NumberGames DESC
结果

|  name | Wins | Losses | NumberGames |
|-------|------|--------|-------------|
|   Roy |    1 |      3 |           4 |
|   Bob |    1 |      2 |           3 |
|   Joe |    2 |      1 |           3 |
|  Mary |    1 |      1 |           2 |
| Ellen |    1 |      0 |           1 |
|  José |    1 |      0 |           1 |
请参见演示

另一种方法:

SELECT  Name,
        SUM(Wins) AS Wins,
        SUM(Losses) AS Losses,
        SUM(Wins) + SUM(Losses) AS NumberGames
    FROM  
      (
        SELECT  winner AS Name, COUNT(*) AS Wins, 0 AS Losses
            FROM  Results
            GROUP BY  winner
        UNION  ALL 
        SELECT  loser AS Name,  0 AS Wins, COUNT(*) AS Losses
            FROM  Results
            GROUP BY  loser 
      )
    ORDER BY 4 DESC