如何使用 COUNT 计算两列中出现的次数?

How to use COUNT to calculate number of occurence in two columns?

我有两个 table。

Table 1: 由球员的名字和他们的id组成。

tournament=> select * from Players;
 id |  name
----+--------
  1 | Rahul
  2 | Rohit
  3 | Ramesh
  4 | Roshan
  5 | Ryan
  6 | Romelu
  7 | Roman
  8 | Rampu
(8 rows)

Table 2:Consist 双方对战,column1 包含获胜者的名字,column2 是失败者的名字。所以这意味着双方都参加了那场比赛。

tournament=> select * from Matches;
 id | winner | loser
----+--------+-------
  1 |      1 |     2
  2 |      3 |     4
  3 |      5 |     6
  4 |      7 |     8
(4 rows)

现在我想统计不同玩家的比赛次数,我已经通过以下查询统计了玩家赢得的比赛次数。

SELECT Players.id, COUNT(Matches.winner) AS Points FROM Players LEFT JOIN (SELECT * from Matches) AS Matches ON Players.id = Matches.winner GROUP by Players.id Order by Points desc, Players.id;
 id | points
----+---
  1 | 1
  3 | 1
  5 | 1
  7 | 1
  2 | 0
  4 | 0
  6 | 0
  8 | 0
(8 rows)

但是我无法理解如何计算每个玩家参加的比赛次数的逻辑?

从上面的比赛table我们可以看到每个球员都打了一次,但我不能在 psql 中写。

以下查询计算两个单独查询中的赢家和输家 ID 值,然后将它们 UNION 合并在一起。不用担心重复计算,因为一支球队不能与自己比赛,而只能与另一支独特的球队比赛。外部查询对团队计数求和。

SELECT t.id, COUNT(t.id) AS numMatches FROM (
    SELECT winner AS id FROM Matches UNION ALL
    SELECT loser AS id FROM Matches
) t GROUP BY t.id

需要一个简单的嵌套子查询,如下:

SELECT pl.id,
(
    SELECT COUNT(id)
    FROM Matches
    WHERE winner = pl.id OR loser = pl.id
) AS matches
FROM Players pl