Pythonの同じpsqlテーブルに2つの列を追加して結果を取得する方法

ilvcs

私は最近データベースについて学び始めました。現在、Pythonのデータベースに裏打ちされたアプリケーションで自分のスキルをテストしています。私はこのようなデータベースに2つのテーブルを作成しました

CREATE TABLE players
(
    id     SERIAL PRIMARY KEY,
    name   TEXT
);

CREATE TABLE matches 
(
    game  SERIAL,
    winner SERIAL REFERENCES players(id),
    loser SERIAL REFERENCES players(id)
);

(id、name、wins、matches)のような順序で、playerid、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)

しかし、それも機能しません。これを解決するのを手伝ってください。

ポール

まず、SERIALFK列にデータ型を使用したくない場合があります。これは、PKには適しているが、FKには適していない自動インクリメント整数型であるため、に固執することをお勧めしますINTEGER

次に、ビジネスルールと呼ばれるものを適用するためのいくつかの制約を検討します。常に2人のプレイヤーがいますか?試合に勝者も敗者もいないのは現実的ですか?ネクタイで終わったらどうしますか?

とにかく、とりあえず簡単にしましょう。2人のプレーヤーが向かい合うときはいつでも、一方が勝者になり、もう一方が負けると仮定しましょう。したがって、試合の総数は勝ち+負けです。

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句の中にサブクエリを入れることもできますが、この方法の方がはるかに見栄えがします。
  • あなたは参加する必要があるplayersmatches何とかが、各列matchesの参照2人の選手。では、2回参加します。
  • 参加するmatches.winnerと、試合ごとに1つの行が表示され、この行に勝者がいます。これはすでに勝利を数えるのに十分ですが、損失に関する情報はまったくありません。
  • 2番目のクエリでは、ゲームごとに1行が追加されますが、今回はこの行に敗者がいます。
  • UNION ALL 2つのクエリの結果を1つの結果セットに結合します。
  • ただし、結果が異なる行を区別できる必要があります。最も簡単な方法は数字を合計することなので、私は勝ち負けを設定10ました。
  • 最後に、現在使用している行をグループ化GROUP BY、集計します。

同様の方法で損失を数えることができます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

同じテーブルの2つの列を比較して不一致の結果のみを取得する方法

分類Dev

リレーショナルテーブルの同じ列に2つの結果があるアイテムを取得する方法

分類Dev

SQL-2つのテーブルを同じ列で結合して水平にスタックする方法

分類Dev

同じテーブル内の他の2つの列を連結して列を更新する方法

分類Dev

身長と体重のために同じテーブルの列から2つのクエリの結果を取得する方法

分類Dev

2つの列を同じテーブルに結合する方法

分類Dev

同じテーブルの2つの列の結合に基づいて行を選択する方法

分類Dev

MySqlはテーブルを結合し、他の2つの列が同じ場合に列を追加します

分類Dev

同じテーブルの2つの列から1つの行で異なる結果を取得するにはどうすればよいですか?

分類Dev

2つのクエリからの2つの結果(同じ列)を1つのクエリテーブルに表示する方法

分類Dev

同じテーブルからの2つの結果を結合するSparkSQL

分類Dev

2つのテーブルを結合して結果を取得する

分類Dev

2つのテーブルを結合し、オブジェクトのように結果を取得する方法

分類Dev

同じテーブルの以前の検索結果に基づいてSQL列を更新する方法

分類Dev

同じ1つのテーブルに基づいて3列の左結合を取得します

分類Dev

mysqlの内部結合を使用して同じテーブルに異なる列を追加する

分類Dev

テーブル内の異なる値に対して同じ行を繰り返さずに2つのテーブルを結合する方法

分類Dev

2つのparreller列に結果を与える同じテーブル内の異なるwhere条件でコマンドを選択します

分類Dev

MySQLの問題:クエリの結果を同じテーブルの列に追加する

分類Dev

2つのテーブルデータを使用して単一の結果を取得する方法

分類Dev

idのパラメータを使用して同じテーブルから2つの値を取得する方法

分類Dev

テーブル セルの 2 つの値を比較して、同じ場合にクラスを追加する

分類Dev

同じdtasnapshotオブジェクトで各ループに1つを使用して2つのノードの結合データを取得する方法

分類Dev

3つのテーブルを2つのwhere句で結合してnullの結果を取得する

分類Dev

2つのテーブルの結果を組み合わせて、SQLの単一の列に表示する方法

分類Dev

2つのテーブルを結合して別の列を追加するSQL

分類Dev

同じテーブルの2つの内部結合の結果をSQLServerの1つの一時テーブルにマージする

分類Dev

2つの異なるテーブルからの同じ結果を2つの異なる行に表示する方法

分類Dev

同じテーブルに2つの配列を表示する

Related 関連記事

  1. 1

    同じテーブルの2つの列を比較して不一致の結果のみを取得する方法

  2. 2

    リレーショナルテーブルの同じ列に2つの結果があるアイテムを取得する方法

  3. 3

    SQL-2つのテーブルを同じ列で結合して水平にスタックする方法

  4. 4

    同じテーブル内の他の2つの列を連結して列を更新する方法

  5. 5

    身長と体重のために同じテーブルの列から2つのクエリの結果を取得する方法

  6. 6

    2つの列を同じテーブルに結合する方法

  7. 7

    同じテーブルの2つの列の結合に基づいて行を選択する方法

  8. 8

    MySqlはテーブルを結合し、他の2つの列が同じ場合に列を追加します

  9. 9

    同じテーブルの2つの列から1つの行で異なる結果を取得するにはどうすればよいですか?

  10. 10

    2つのクエリからの2つの結果(同じ列)を1つのクエリテーブルに表示する方法

  11. 11

    同じテーブルからの2つの結果を結合するSparkSQL

  12. 12

    2つのテーブルを結合して結果を取得する

  13. 13

    2つのテーブルを結合し、オブジェクトのように結果を取得する方法

  14. 14

    同じテーブルの以前の検索結果に基づいてSQL列を更新する方法

  15. 15

    同じ1つのテーブルに基づいて3列の左結合を取得します

  16. 16

    mysqlの内部結合を使用して同じテーブルに異なる列を追加する

  17. 17

    テーブル内の異なる値に対して同じ行を繰り返さずに2つのテーブルを結合する方法

  18. 18

    2つのparreller列に結果を与える同じテーブル内の異なるwhere条件でコマンドを選択します

  19. 19

    MySQLの問題:クエリの結果を同じテーブルの列に追加する

  20. 20

    2つのテーブルデータを使用して単一の結果を取得する方法

  21. 21

    idのパラメータを使用して同じテーブルから2つの値を取得する方法

  22. 22

    テーブル セルの 2 つの値を比較して、同じ場合にクラスを追加する

  23. 23

    同じdtasnapshotオブジェクトで各ループに1つを使用して2つのノードの結合データを取得する方法

  24. 24

    3つのテーブルを2つのwhere句で結合してnullの結果を取得する

  25. 25

    2つのテーブルの結果を組み合わせて、SQLの単一の列に表示する方法

  26. 26

    2つのテーブルを結合して別の列を追加するSQL

  27. 27

    同じテーブルの2つの内部結合の結果をSQLServerの1つの一時テーブルにマージする

  28. 28

    2つの異なるテーブルからの同じ結果を2つの異なる行に表示する方法

  29. 29

    同じテーブルに2つの配列を表示する

ホットタグ

アーカイブ