我正在尝试返回一个查询,该查询将显示玩家在游戏中玩了多少次以及他/她赢了多少次。这是我到目前为止,停留在最后一个连接查询
链接到我的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返回所有玩家。
我想: 玩家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
答案 0 :(得分: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;
关键是你要在match
表上保持联接。其余的是简单的条件聚合。