PDA

View Full Version : query sql & TrackMania Nations


HexDEF6
13-03-2006, 18:08
Ho un databse mysql, che ho infarcito di dati...
nel databes ho una tabella (tempi) con i seguesnti campi:
record_id (autoincrementante) track (nome del tracciato) user (nome dell'utente) record_time (il tempo fatto) record_date (e quando e' stato fatto)
in questa tabella vengono inseriti tutti i tempi di tutti gli utenti su tutte le piste...
quello che vorrei fare adesso e' tirar fuori il tempo migliore di ogni utente per una certa pista... siccome sono alle prime armi (ho iniziato a vedere un paio di ore fa l'sql!), quello che sono riuscito a fare e':

SELECT `track` , `user` , `record_date` , MIN( `record_time` )
FROM `tempi`
WHERE `track` = "nometracciato"
GROUP BY `user`
ORDER BY 'MIN( `record_time` )' ASC


in questa maniera fa quasi quello che mi interessa sbagliando ovviamente record_date visto che mi sputa non quella relativa al MIN( 'record_time') ma la prima che trova nel db relativa all'utente...

Come posso rimediare?

------------------------------------------------------------
Per i curiosi alcune info in piu'


Questa cosa qua servirebbe alla fine per generare una pagina web (in php) dove vengono fatti vedere tutti i tempi di tutti gli utenti che girano sul server di TrackMania Nations che ho messo in piedi...
per ora quello che riesco a fare (con un po di script bash, awk e sed) e' questo:
http://supahlooza.homelinux.org/record
partendo dal file di log del server di Trackmania... ovviamente se riesco a mettere tutto in un db, pian pianino si potrebbe avere una pagina decente con molte piu' informazioni (tipo: tutti i tempi che un tale utente ha fatto su una pista, e non solo il migliore, e magari l'andamento nel tempo dei propri record... o la generazione di una classifica generale in base alla posizione di un utente su ogni pista... insomma cose assolutamente impossibili da fare con un po di script bash...) se qualcuno ha voglia di darmi una mano e' piu' che ben accetto (visto che sono una chiavica con sql e php :D )

Ciao!

HexDEF6
13-03-2006, 23:21
Dopo qualche tentativo, sembra che cosi' funzioni:


SELECT `track` , `user` , `record_date` , `record_time`
FROM `tempi` s1
WHERE `track` = "nome_tracciato"
AND `record_time` = (
SELECT MIN( s2.record_time )
FROM `tempi` s2
WHERE `track` = "nome_tracciato"
AND s1.user = s2.user )
ORDER BY record_time


ma ci impiega tempi epocali (piu' di 5 minuti... ok che il db gira su un p3 450... ma 5 minuti mi sembrano un'esagerazione) quando con gli script bash ci mette circa 30 secondi per generarmi la stessa cosa per TUTTE le piste.... dove sbaglio????


EDIT: pensandoci su, potrebbe essere che fare una select nella select il tempo di esecuzione va col quadrato o quasi? se e' cosi' e' molto meglio se divido tutto il mio db in molte taballe (una per ogni pista), in modo tale che il tempo per fare una query dovrebbe diventare circa 1/1000 rispetto a quello attuale (sono circa 30 le piste con un numero circa uguale di tempi per ognuna)... ho pensato giusto????

HexDEF6
14-03-2006, 01:03
Alla fine ho risolto usando la query di sopra, ma facendo una tabella per ogni tracciato...

se a qualcuno interessa, questi sono gli script (molto spartani) per generare dell'sql dai log di TrackMania:


#!/bin/bash

gawk '{if ($3 == "Loading") {track = $5" "$6" "$7" "$8" "$9" "$10" "$11} else if (( $3 == "<time>" ) && ( $4 != "0:00.00" )) { print "INSERT INTO `" track "` ( `record_id` , `user` , `record_time` , `record_date`) VALUE (NULL,'\''" $6 "'\'','\''" $4 "'\'','\''" $1" "$2 "'\'');" >> record }}' record=record.1 $1
sed -e 's/.Challenge.Gbx... \{,6\}//g' -e 's/\$[0-9a-fA-F]\{3\}//g' -e 's/\$[zwsgIWnSim]//g' record.1 > record.2
sort -t \` record.2 > record.sql
gawk -F \` 'BEGIN { track = pipperobello }{ if ( $2 != track){ track = $2 ; print "CREATE TABLE `" track "` ( record_id INT (11) NOT NULL auto_increment unique, user CHARACTER (20), record_time CHARACTER (7), record_date CHARACTER (21));" >> tabelle }}' tabelle=tabelle.sql record.sql


lo script necessita in ingresso il file di log di trackmania e genera un po di file (le vie di mezzo sono per eventuali debug) i "risultati finali" sono record.sql e tabelle.sql
In tabelle.sql si trova il codice per generare una tabella per ogni tracciato (ovviamente per le esecuzioni successive bisogna togliere le righe relative alle tabelle gia fatte) e in record.sql c'e' il codice per popolare il db...

credo che l'uso che faccio io del db sia un po barbaro (dovrei convertire i tempi in secondi e quindi usare degli interi nel db e non dei character... ecc. che incrementi avrei di velocita' mettendo le cose a posto?) ma del resto sono un newbie e quindi.....


Ciao!