|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Dec 2000
Città: Trento
Messaggi: 5917
|
query sql & TrackMania Nations
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': Codice:
SELECT `track` , `user` , `record_date` , MIN( `record_time` ) FROM `tempi` WHERE `track` = "nometracciato" GROUP BY `user` ORDER BY 'MIN( `record_time` )' ASC 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 Ciao!
__________________
Linux User #272700 >+++++++++[<+++++++++>-]<+.++.>++++[<---->-]<++.+++++++. HOWTO: SSH Firewall e DMZ ɐɹdosoʇʇos oʇuǝs ıɯ |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Dec 2000
Città: Trento
Messaggi: 5917
|
Dopo qualche tentativo, sembra che cosi' funzioni:
Codice:
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 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????
__________________
Linux User #272700 >+++++++++[<+++++++++>-]<+.++.>++++[<---->-]<++.+++++++. HOWTO: SSH Firewall e DMZ ɐɹdosoʇʇos oʇuǝs ıɯ Ultima modifica di HexDEF6 : 13-03-2006 alle 23:53. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Dec 2000
Città: Trento
Messaggi: 5917
|
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: Codice:
#!/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
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!
__________________
Linux User #272700 >+++++++++[<+++++++++>-]<+.++.>++++[<---->-]<++.+++++++. HOWTO: SSH Firewall e DMZ ɐɹdosoʇʇos oʇuǝs ıɯ |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:28.



















