2012-05-15 8 views
6

Sto lavorando a un'applicazione golf che include un sistema di scorecard. Sto memorizzando ogni punteggio per ogni giocatore nel database e ho bisogno di trovare una query per determinare l'ordine del tee. Così, per esempio, se i giocatori hanno giocato 3 fori e il punteggio simile a questa ...SQL per determinare l'ordine di tee nell'applicazione golf

Player 1 2 3 
--------- - - - 
Player 1: 3, 4, 3 
Player 2: 2, 3, 3 
Player 3: 2, 4, 3 

... Poi l'ordine e simile a questa ...

1.) Player 2 
2.) Player 3 
3.) Player 1 

... Quindi i giocatori saranno ordinati in base ai loro punteggi rispetto ai punteggi degli avversari. Ha senso? Questo è possibile anche con una query, o dovrei scrivere una funzione per analizzare un array 2d nel codice? Sto usando Java in quel caso.

mia struttura della tabella simile a questa:

  • giocatori (Player ID e nome del giocatore)
  • Rounds (id rotonda, ovviamente id)
  • punteggi (rotondo id, giocatore id, numero del foro e punteggio)
+0

Is l'ordinamento fatto da punteggio totale o all'ultima buca, poi quella precedente, ecc? –

+0

L'ordinamento sarebbe il punteggio precedente più basso. Quindi per il giocatore 2, puoi vedere che hanno battuto gli altri due giocatori nella buca 2, quindi il giocatore 2 sarebbe il primo. Quindi, per continuare a tornare indietro (partendo dal buco 2 e senza contare il giocatore 2), il giocatore 3 ha battuto il giocatore 1 sul buco 1 e ciò rende il giocatore 3 ordinato per secondo, con la conseguenza che il giocatore 1 è stato ordinato per ultimo. Questo chiarisce le cose? Confondendo lo so haha ​​ –

+2

Ti suggerisco di farlo in java – keyser

risposta

3

Vedo una soluzione che utilizza le funzioni di windows row_number() e una colonna aggiuntiva nel database per l'ordine a ogni livello (o un CTE ricorsivo in SQL Server). Tuttavia, SQLite non supporta questo.

Ecco la mia raccomandazione sulla implementazione della soluzione senza fare un sacco di interrogazione a ritroso:

(1) Assegnare l'ordine tee per il primo tee.

(2) Per ogni tee successivo, guardare il punteggio precedente e del precedente ordine tee:

(3) Assegnare il nuovo ordine tee da loop attraverso i punteggi precedenti, ordinando dal punteggio più alto DISC e tee precedente ordina ASC.

Poiché hai solo pochi giocatori per round, è ragionevole farlo nel livello dell'app. Tuttavia, se si dispone di un database che supporta la funzione di finestra, è possibile eseguire più facilmente una soluzione solo per il database.

Non posso resistere. Ecco un codice che farà questo con una tabella per memorizzare gli ordini. Hai bisogno di scorrere, una volta per foro:

create table ThisOrder (
    ThisOrderId int primary key autoincrement, 
    RoundId int, 
    Hole int, 
    PlayerId int 
) 

inizializzare con ogni giocatore in un certo ordine.

Poi, inserire nuove righe nella tabella per ogni buca:

insert into ThisOrder(RoundId, HoleId, PlayerId) 
    select s.RoundId, s.Hole+1, s.PlayerId 
    from Scores s join 
     ThisOrder to 
     on s.PlayerId = to.PlayerId and 
      s.RoundId = to.RoundId and 
      s.Hole = to.Hole 
    order by s.Score DESC, to.Order ASC 

avrete bisogno di chiamare questo una volta per ogni buca, meno uno.

quindi ottenere il vostro ordine come:

select * 
from ThisOrder 
where roundid = <roundid> and hole = <thehole> 
order by ThisOrderId 
+0

Non ci avevo pensato, mi piace questa soluzione perché potrei semplicemente interrogare la colonna ordine tee in qualsiasi momento. È leggero perché è solo guardando indietro ai punteggi dei fori precedenti e non elaborando ogni punteggio per ogni giocatore ogni volta che vorrei conoscere l'ordine del tee. Grazie, lo prenderò sicuramente in considerazione. –

+0

Haha grazie per le modifiche, mi hai decisamente conquistato con questo. Mi piace questo approccio molto più dei miei pensieri originali. Ottima soluzione, apprezzalo. –

0

Quindi, avresti bisogno di riassumere i punteggi per ogni buca precedente al foro di corrente per ogni giocatore, quindi ordinare l'elenco di ID del giocatore da parte del riassunto punteggi.

Qualcosa del genere dovrebbe funzionare:

SELECT SUM(score) AS score, player_id FROM Scores WHERE round_id=$current_round AND hole_number<$current_hole GROUP BY player_id ORDER BY score; 

Questo si traduce in una tabella dei risultati di due colonne (player_id e punteggio) con tante righe quanti sono i giocatori, mettendo il giocatore con il punteggio più alto.

+0

Qualcosa del genere non funzionerà perché ho bisogno di fare l'ordine in base al punteggio più basso precedente rispetto ai punteggi degli avversari, non dal punteggio totale purtroppo. Questo metodo funzionerà se desidero determinare chi sta vincendo. –

0

questa query restituisce il foro più alto in cui il giocatore ha avuto il punteggio più basso e ordini che:

SELECT * FROM Players p 
ORDER BY 
    (SELECT MAX(s1.hole_number) FROM Scores s1 
    LEFT JOIN Scores s2 
    ON s2.round_id = s1.round_id AND 
     s1.hole_number = s2.hole_number AND 
     s2.score < s1.score 
    WHERE s1.player_id = p.player_id AND 
    s1.round_id = 1 AND s2.round_id IS NULL) DESC 
+0

Capisco dove stai andando, ma non capisco. Soprattutto se c'è stata solo una buca giocata e ci sono stati legami in quella buca, non avremo alcuna idea di come determinare l'ordine corretto (colpa mia con la struttura della tabella). Se ogni giocatore avesse un punteggio diverso per ogni buca, allora funzionerebbe. –

+0

@Alex_Hyzer_Kenoyer, sono d'accordo. Aggiungi un'altra espressione ORDER BY con l'ordine originale come 'ORDER BY (...) DESC, player_order ASC'. –

Problemi correlati