如何在python中通过在同一psql表中添加两列来获得结果
我最近开始学习数据库。现在我正在用python在一个数据库支持的应用程序上测试我的技能。我已经在数据库中创建了两个类似这样的表如何在python中通过在同一psql表中添加两列来获得结果,python,sql,database,postgresql,psql,Python,Sql,Database,Postgresql,Psql,我最近开始学习数据库。现在我正在用python在一个数据库支持的应用程序上测试我的技能。我已经在数据库中创建了两个类似这样的表 CREATE TABLE players ( id SERIAL PRIMARY KEY, name TEXT ); CREATE TABLE matches ( game SERIAL, winner SERIAL REFERENCES players(id), loser SERIAL REFERENCES
CREATE TABLE players
(
id SERIAL PRIMARY KEY,
name TEXT
);
CREATE TABLE matches
(
game SERIAL,
winner SERIAL REFERENCES players(id),
loser SERIAL REFERENCES players(id)
);
我要对这些人进行查询,以获得playerid、name wins、matches等结果,顺序如下(id、name、wins、matches)
我正在使用此代码来实现这一点
SELECT id, name, count(matches.winner) as wins,
(count(matches.winner) + count(matches.loser)) as match
FROM players LEFT JOIN matches ON players.id = matches.winner
GROUP BY players.id ORDER BY wins
似乎不起作用,请帮我解决这个问题
谢谢
我在下面尝试了这个代码
DB = connect()
c = DB.cursor()
c.execute("""WITH
results AS (
select P.id,
P.name,
1 win
from players P inner join matches M
on M.winner = P.id
union all
select P.id,
P.name,
0 win
from players P inner join matches M
on M.loser = P.id)
select id,
name,
sum(win) wins,
count(*) matches
from results
group by id, name """)
return c.fetchall()
DB.close()
此代码没有从数据库中获取任何数据,而是返回[]。我还尝试将我的查询字符串替换为
query = oldstring.replace(" ","_")
c.execute(query)
但它也不起作用。请帮我解决这个问题。首先,您可能不想对FK列使用
串行
数据类型,因为它是一种自动递增的整数类型,对PK有好处,但不适合FK,最好还是使用整数
第二,考虑一些约束来执行我们所称的业务规则。总是有两个球员吗?比赛没有赢家或输家现实吗?如果以平局结束呢
不管怎样,现在让我们保持简单,假设任何时候两个玩家面对面,其中一个是赢家,另一个是输家。所以比赛的总数是赢+输
WITH
results AS (
select P.id,
P.name,
1 win
from players P inner join matches M
on M.winner = P.id
union all
select P.id,
P.name,
0 win
from players P inner join matches M
on M.loser = P.id)
select id,
name,
sum(win) wins,
count(*) matches
from results
group by id, name
那么,这里发生了什么:
是一个。它基本上是一个命名的子查询。我在这里使用它是为了可读性。我可以将子查询放在WITH
子句中,但这样看起来好多了FROM
- 您需要以某种方式加入
和玩家
,但是匹配
引用两个玩家。好的,那么,我们将加入他们两次中的每一行匹配
- 当您参加
每场比赛都有一行,这一行中有赢家。这已经足以统计胜利,但绝对没有关于失败的信息比赛时。赢家
- 第二个查询为每个游戏添加一行,但这一次这一行中有输家
将两个查询的结果合并到一个结果集中UNION ALL
- 但我们需要能够区分结果不同的行。最简单的方法是对数字求和,因此我将赢的设置为
,输的设置为1
0
- 最后,现在使用
分组并聚合行李>按
您可以用类似的方式计算损失。您可以显示一些示例数据以及您得到的数据和您期望的数据吗?您好,我尝试了这个方法,但不幸的是,此代码无法从表中检索任何数据。当我尝试打印时,我只得到[],而不是表格。我将在我的问题中跳过我的代码。请提供一些示例数据。不看它,我看不出结果集为空的任何原因。是的,它正在工作。。。非常感谢你。因为我是数据库的初学者,你能解释一下你的代码吗?我在我的帖子中添加了一些描述。希望有帮助。