Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中通过在同一psql表中添加两列来获得结果_Python_Sql_Database_Postgresql_Psql - Fatal编程技术网

如何在python中通过在同一psql表中添加两列来获得结果

如何在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

我最近开始学习数据库。现在我正在用python在一个数据库支持的应用程序上测试我的技能。我已经在数据库中创建了两个类似这样的表

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
  • 最后,现在使用
    分组并聚合行

您可以用类似的方式计算损失。

您可以显示一些示例数据以及您得到的数据和您期望的数据吗?您好,我尝试了这个方法,但不幸的是,此代码无法从表中检索任何数据。当我尝试打印时,我只得到[],而不是表格。我将在我的问题中跳过我的代码。请提供一些示例数据。不看它,我看不出结果集为空的任何原因。是的,它正在工作。。。非常感谢你。因为我是数据库的初学者,你能解释一下你的代码吗?我在我的帖子中添加了一些描述。希望有帮助。