2016-10-14 30 views
1

我想返回一個查詢,顯示玩家在遊戲中玩過多少次,以及他/她贏了多少次。這是我到目前爲止,卡在最後一個加入查詢如何正確地將這兩個PSQL查詢結合在一起?

鏈接到我的SQL小提琴: http://sqlfiddle.com/#!15/46b2a/52

我有兩個表:

CREATE TABLE player(
id serial PRIMARY KEY NOT NULL, 
name varchar(255) NOT NULL 
); 

CREATE TABLE match(
id serial PRIMARY KEY, 
winner serial REFERENCES player(id) NOT NULL, 
loser serial REFERENCES player(id) NOT NULL CHECK (loser != winner) 
); 

CREATE SEQUENCE playerid_sequence 
start 1 
increment 1; 

CREATE SEQUENCE matchid_sequence 
start 1 
increment 1; 

我填充我的表有一些例子插入:

--Player Insertion 
INSERT INTO player VALUES(nextval('playerid_sequence'), 'Kevin'); 
INSERT INTO player VALUES(nextval('playerid_sequence'), 'Dennis'); 
INSERT INTO player VALUES(nextval('playerid_sequence'), 'George'); 
INSERT INTO player VALUES(nextval('playerid_sequence'), 'Michael'); 

--Match Insertion 
INSERT INTO match VALUES(nextval('matchid_sequence'), 1, 2); 
INSERT INTO match VALUES(nextval('matchid_sequence'), 1, 3); 
INSERT INTO match VALUES(nextval('matchid_sequence'), 1, 4); 
INSERT INTO match VALUES(nextval('matchid_sequence'), 2, 3); 

我創建了兩個SQL查詢:

--How many did a player win? 
SELECT player.id, player.name, count(player.name) as wins FROM player, match 
WHERE player.id = match.winner GROUP by player.name, player.id ORDER BY wins DESC; 

--How many matches did a particular player participate in? 
SELECT player.id, player.name, count(player.name) as matches_played 
FROM player, match 
WHERE player.id = match.winner OR player.id = match.loser 
GROUP by player.name, player.id 
ORDER by matches_played DESC; 

我做出了嘗試加入他們的行列:

SELECT 
* 
FROM 
(SELECT player.id, player.name, count(player.name) as wins FROM player, match 
WHERE player.id = match.winner GROUP by player.name, player.id ORDER BY wins DESC) t1 
FULL OUTER JOIN 
(SELECT player.id as id, count(player.name) as matches_played 
FROM player, match 
WHERE player.id = match.winner OR player.id = match.loser 
GROUP by player.id 
ORDER by matches_played DESC) t2 
ON t1.id = t2.id; 

上述連接查詢只返回一組從T1的球員,而我希望它從T2返回所有的球員。

我想: player id |名稱|勝|所有球員的總比賽勝利,如果他們沒有獲勝,贏得勝利球隊中的0。

我:

id name wins id matches_played 
1 Kevin 3  1 3 
2 Dennis 1  2 2 
(null) (null) (null) 4 1 
(null) (null) (null) 3 2 

回答

1

我想查詢可以簡化爲:

select p.id, p.name, 
     count(case when m.winner = p.id then 'X' end) as wins, 
     count(m.id) as matches_played 
    from player p 
    left join match m 
    on m.winner = p.id or m.loser = p.id 
group by p.id, p.name; 

SQL Fiddle Demo

的關鍵是,你要留下參加在match表。其餘的是簡單的條件聚合。

相關問題