2013-04-24 3 views
0

Я пытаюсь написать программу для запроса базы данных. База данных golfDB и состоит из одной таблицы называется players с 5 полями:SQLIte3 запрос к базе данных

  • 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)] 
+1

попробуйте этот запрос: выберите * у игроков, где pars> = 0 order by pars desc limit 1 –

+0

@varahram, если вы ограничите его 1, это не принимает во внимание тот факт, что более одного игрока может иметь одинаковое количество пар – tinydancer9454

ответ

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) 

Так что это делает, найти максимальное значение для «Парса», затем выбрать те строки, которые имеют это значение.

+0

Спасибо, я не знал о команде LIMIT. Однако единственная проблема заключается в том, что может быть более одного игрока с одинаковым количеством парсов. – tinydancer9454

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

docs описывают, как сравниваются кортежи. (В принципе, запись по записи).Если вы не можете изменить порядок своего запроса, вы также можете сделать что-то вроде player, pars = max(playerPars, key=lambda p: p[1])

+0

Я предпочитаю использовать ключевое слово ORDER BY, но я просто не уверен, как бороться с тем фактом, что более одного игрока может иметь одинаковое количество парсов, и поэтому оба они должны будут выводиться. – tinydancer9454

+0

Используйте два запроса! Сначала найдите минимальное количество парсов, а затем 'SELECT name FROM players WHERE pars =?' – Felipe

Смежные вопросы