【问题标题】:SQLIte3 querying a databaseSQLIte3 查询数据库
【发布时间】:2013-04-24 14:59:23
【问题描述】:

我正在尝试编写一个程序来查询数据库。数据库是 golfDB,它由一个名为 players 的表组成,其中包含 5 个字段:

  • name(玩家姓名)
  • totalGross(每轮总分的总和)
  • totalRounds(游戏轮数)
  • pars(完成的总数量)
  • birdies(抓到小鸟总数)

我的程序需要输出得分最多的球员,输入球员的平均得分(totalGross/totalRounds),并按照总得分从低到高的顺序列出球员。

我真的不知道如何输出具有最多标准杆的球员。现在我的代码正在输出一个列表列表,每个列表都有一个玩家和他们的标准杆。我不知道如何按他们的标准来排序,然后选择最高的,因为我所做的一切都只是选择数字,然后我无法回到他们属于哪个球员。

有谁知道如何仅通过 par 的数量对列表列表进行排序,然后它可以打印播放器?

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)]

【问题讨论】:

  • 试试这个查询:select * from player where pars >= 0 order by pars desc limit 1
  • @varahram 如果您将其限制为 1,则没有考虑到多个玩家可能拥有相同数量的帕斯这一事实

标签: python database sqlite


【解决方案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() 来获取那一行。

编辑

你说可能有不止一个人拥有最多的par。这使得查询变得更加复杂:现在我们进入子查询:

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

所以这是在寻找 'pars' 的最大值,然后选择具有该值的行。

【讨论】:

  • 谢谢,我不知道 LIMIT 命令。然而,唯一的问题是可能有不止一名球员拥有相同数量的帕。
【解决方案2】:

您可以在查询中使用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 ;-)

docs 描述了如何比较元组。 (基本上,逐个条目)。如果您无法更改查询的顺序,您也可以执行player, pars = max(playerPars, key=lambda p: p[1])

之类的操作

【讨论】:

  • 我更喜欢使用 ORDER BY 关键字,但我只是不确定如何处理这样一个事实,即多个玩家可能拥有相同数量的帕,因此两者都需要输出.
  • 然后使用两个查询!先求最小par数再SELECT name FROM players WHERE pars=?
猜你喜欢
  • 2013-04-19
  • 1970-01-01
  • 1970-01-01
  • 2011-06-06
  • 1970-01-01
  • 2019-05-08
  • 1970-01-01
  • 2021-12-11
相关资源
最近更新 更多