2015-11-02 78 views
1

我有兩張桌子。如何使用COUNT計算兩列中出現的次數?

表1:由玩家的名字和他們的ID組成。表2:由兩個對手組成的對手組成,第一列包含冠軍和第二列輸家的名字。所以這意味着無論是參加那場比賽。

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) 

但是我無法得到我應該如何計算每個球員的比賽數量的邏輯?

從上面的匹配表中我們可以看到每個玩家都玩過一次,但我無法在psql中寫入。

回答

0

以下查詢計算兩個單獨查詢中的贏家和輸家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 
+0

獲取錯誤: 'ERROR:列 「matches.winner」 必須出現在GROUP BY子句或在聚合中使用功能 線路2:選擇贏家AS ID,計數(*)從匹配的num numS ...' –

+0

我更新了我的答案,請再次檢查它。 –

+0

是的,它的工作可以請你解釋一下。 –

1

需要一種簡單的嵌套子查詢,如下所示:

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

嗨,謝謝你的回答。你的答案正在工作,但我已經給了Tim正確的答案。 –