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