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