SQL:从结果页面计算球队的比赛次数
对于您所展示的这个简单的案例,只有几个地方是您应该修复的。对于您所显示的问题,再一次。
First:更改表的列类型matches它不应该是SERIAL,因为它是一个自动增量类型的列(不是真实类型)。这两列都是foreign keys,并且应该是integer、int或bigint
作为
代码语言:javascript运行复制create table matches (
winner bigint,
loser bigint,
gamepoints int,
constraint fk_player_winner foreign key (winner)
references players(id),
constraint fk_player_loser foreign key (loser)
references players(id)
);Second:要知道玩家玩了多少场游戏,您可以创建两个子查询,一个包含赢家,另一个包含输家,并将这两个子查询的值相加。问题是你必须减少两个游戏点:
代码语言:javascript运行复制select w.id, w.name, w.gp-l.gp as gamepoints, w.ng+l.ng
from (select p.id, p.name, sum(m.gamepoints) gp, count(m.winner) as ng
from players p inner join matches m
on p.id=m.winner
group by p.id, p.name ) w
INNER JOIN
(select p.id, p.name, sum(m.gamepoints) gp, count(m.loser) as ng
from players p inner join matches m
on p.id=m.loser
group by p.id, p.name) l on w.id=l.id;从它你创建你的视图。
注意:也许我在这两个子查询上做的有点过头了。可以使用两个players表和一个matches之间的连接
看看它是如何在小提琴上进行的:http://sqlfiddle.com/#!15/5b6a4/4