0

データベースにクエリを実行するプログラムを作成しようとしています。データベースは golfDB でplayers、5 つのフィールドを持つ1 つのテーブルで構成されています。

  • name(プレイヤー名)
  • totalGross(各ラウンドの総得点の合計)
  • totalRounds(プレイしたラウンド数)
  • pars(合計パー数)
  • birdies(合計バーディー数)

私のプログラムは、パー数が最も多いプレーヤー、入力されたプレーヤーの平均スコア (totalGross/totalRounds) を出力し、合計グロス スコアの順にプレーヤーをリストする必要があります。

パー数が最も多いプレーヤーを出力する方法が本当にわかりません。現在、私が持っているコードは、リストのリストを出力しており、それぞれにプレーヤーとそのパーが含まれています。私が試したすべてのことは数字を選択するだけであり、それらがどのプレーヤーに属しているかに戻ることができないため、それらをパーで注文してから最も高いものを選択する方法がわかりません.

パーの数だけでリストのリストを並べ替えて、プレーヤーを印刷する方法を知っている人はいますか?

import sqlite3

def getDBCursor(DB):
    """obtain and return a cursor for the database DB"""
    conn= sqlite3.connect('/Users/tinydancer9454/Documents/python/golfDB')
    cursor= conn.cursor()
    return cursor

def queryDBpars(cursor):
    """find out which player had the most pars"""
    cursor.execute('select name, pars from players where pars >= 0')
    playerPars= cursor.fetchall()


def queryDBavgScore(cursor):
    """find the average score of inputed player"""
    player= input("Please enter the player's name: ")
    cursor.execute('select totalGross from players where name = ?', (player,))
    totalGrossScore = cursor.fetchone()
    cursor.execute('select totalRounds from players where name = ?', (player,))
    totalRoundsScore = cursor.fetchone()
    answer = totalGrossScore[0]/ totalRoundsScore[0]
    print('The average score for', player, 'is', answer,)

def queryDBplayers(cursor):
    """lists the players in order of their total gross score"""


def main():
    """obtain cursor and query the database: golfDB"""
    cursor= getDBCursor('golfDB')
    queryDBpars(cursor)
    queryDBavgScore(cursor)
    queryDBplayers(cursor)
    cursor.close()

そして、これは出力です:

[('Ruth', 16), ('Elena', 12), ('Jane', 12), ('Ezgi', 13), ('Ricki', 9), ('Margaret', 10), ('Rosalia', 16), ('Betty', 14)]
4

2 に答える 2

1

これは単純な SQL の質問です。あなたの質問に対する率直な答えを得るには、次のものが必要です。

SELECT name, pars FROM players WHERE pars >= 0 ORDER BY pars DESC

ただし、それでも、必要のないすべてのプレーヤーを選択する必要があります。それを防ぐには、LIMIT 句を追加します。

SELECT name, pars FROM players WHERE pars >= 0 ORDER BY pars DESC LIMIT 1

cursor.fetchone()そして、その単一の行だけを取得するために使用します。

編集

あなたは、パー数が最も多い人が複数いる可能性があると言います。これにより、クエリが大幅に複雑になります。サブクエリに入ります。

SELECT name, pars FROM players WHERE pars >= 0 WHERE pars = (
    SELECT MAX(pars) FROM players)

つまり、これは「pars」の最大値を見つけてから、この値を持つ行を選択することです。

于 2013-04-24T15:24:50.327 に答える
0

クエリでORDER BY SQL キーワードを使用するか、Python で実行する場合は、いくつかの方法で実行できます。

def queryPars(cursor):
    """find out which player had the most pars"""
    cursor.execute('select pars, name from players where pars >= 0')
    ## Note flipped order ^^^^^^^^^^^^
    playerPars = cursor.fetchall()
    pars, player_most_pars = max(playerPars)
    # Now do something useful with it ;-)

ドキュメントは、タプルがどのように比較されるかを説明しています。(基本的にエントリーバイエントリー)。クエリの順序を変更できない場合は、次のようなこともできますplayer, pars = max(playerPars, key=lambda p: p[1])

于 2013-04-24T15:29:30.323 に答える