View Full Version : [sql][newbie] migliori tempi sul giro di ogni pilota
Ciao, sto cercando di imparare un pochino di python e sql, e mi ritrovo con questo problema, avendo una tabella (giri) del tipo:
nome_pilota tempo data
pilota1 10 0
pilota2 12 1
pilota4 9 2
pilota1 11 3
pilota3 7 4
pilota1 6 5
pilota2 15 6
pilota3 11 7
pilota2 7 8
pilota1 9 9
vorrei ottenere i migliori tempi sulla pista, ma senza doppioni sul nome del pilota (non mi interessa se il pilota X ha fatto il primo il secondo e il terzo tempo sul giro) come succede con questa query:
select nome_pilota, tempo, data from giri order by tempo asc
come db uso mysql 5...
idee?
amedeoviscido
04-02-2008, 15:09
prova la clausola "SELECT DISTINCT nomepilota"... ma non so se funziona con mysql onestamente
prova la clausola "SELECT DISTINCT nomepilota"... ma non so se funziona con mysql onestamente
no la distinct non funziona, se faccio:
select distinct nome_pilota, tempo, data from giri order by tempo asc
mi da lo stesso risultato (infatti ogni riga e' diversa dall'altra)
SELECT nome_pilota, MIN(tempo) AS tempo FROM giri GROUP BY nome_pilota ORDER BY tempo asc
SELECT nome_pilota, MIN(tempo) AS tempo FROM giri GROUP BY nome_pilota ORDER BY tempo asc
questa funziona... ma non fa tutto quello che mi serve:
voglio sapere anche la data di quando e' stato fatto il tempo :)
questa funziona... ma non fa tutto quello che mi serve:
voglio sapere anche la data di quando e' stato fatto il tempo :)
...seleziona nome_pilota,tempo minimo,orario etc...
...è implicito nella query...
...ciao...
...seleziona nome_pilota,tempo minimo,orario etc...
...è implicito nella query...
...ciao...
scusa ma non ho capito...
se intendi che debbo fare un:
SELECT nome_pilota, MIN(tempo) AS tempo, data FROM giri GROUP BY nome_pilota ORDER BY tempo asc
non funziona, in quanto ritorna si un risultato per ogni pilota, e con il tempo minimo, ma la data non e' quella del tempo minimo, ma la prima che si trova nel db... (questo sotto mysql... da quello che mi dicono con sql server sembra funzionare correttamente, cioe' come risultato da' la riga del pilota in cui il tempo e' minimo)
SELECT nome_pilota, MIN(tempo) AS tempo,data FROM giri GROUP BY nome_pilota,data ORDER BY tempo,data asc
prova così ;)
SELECT nome_pilota, MIN(tempo) AS tempo,data FROM giri GROUP BY nome_pilota,data ORDER BY tempo,data asc
prova così ;)
niente da fare :(
mi da i doppioni come se non gruppassi
niente da fare :(
mi da i doppioni come se non gruppassi
cosa ti torna esattamente?i doppioni in nome? in mysql la 'with' funziona?
cosa ti torna esattamente?i doppioni in nome? in mysql la 'with' funziona?
mysql> SELECT id_pilota, MIN(tempo) AS tempo,data FROM giri where id_pista = 31 GROUP BY id_pilota,data ORDER BY tempo,data asc limit 15;
+-----------+-------+------------+
| id_pilota | tempo | data |
+-----------+-------+------------+
| 3 | 51.98 | 1154646327 |
| 3 | 52.38 | 1147544841 |
| 3 | 52.67 | 1154620376 |
| 55 | 52.73 | 1152131017 |
| 61 | 52.76 | 1151860446 |
| 3 | 52.79 | 1149285072 |
| 1598 | 52.84 | 1149841632 |
| 3 | 52.9 | 1146852491 |
| 36 | 52.91 | 1151959281 |
| 3 | 52.94 | 1146775829 |
| 55 | 52.94 | 1149841437 |
| 60 | 52.96 | 1147045050 |
| 61 | 52.96 | 1151527541 |
| 36 | 52.98 | 1150647279 |
| 61 | 53.17 | 1150830025 |
+-----------+-------+------------+
15 rows in set (0.13 sec)
per la with non so nemmeno cosa sia :D (vado a vedere)
con la with la cosa funzionerebbe così
with temp as (SELECT nome_pilota, MIN(tempo) AS tempo FROM giri GROUP BY nome_pilota ORDER BY tempo asc)
select nome_pilota,tempo,data from temp,giri where temp.nome_pilota=gire.nome_pilota and temp.tempo=giri.tempo
mi scuso per eventuali errori sintattici (non ho qui un DB per fare le prove)
con la with la cosa funzionerebbe così
with temp as (SELECT nome_pilota, MIN(tempo) AS tempo FROM giri GROUP BY nome_pilota ORDER BY tempo asc)
select nome_pilota,tempo,data from temp,giri where temp.nome_pilota=gire.nome_pilota and temp.tempo=giri.tempo
mi scuso per eventuali errori sintattici (non ho qui un DB per fare le prove)
mi correggo
with temp(pilota,time) as (SELECT nome_pilota, MIN(tempo) AS tempo FROM giri GROUP BY nome_pilota ORDER BY tempo asc)
select pilota,time,data from temp,giri where pilota=nome_pilota and time=tempo
ho corretto errori di battitura aggiornando la sintassi della with che era leggermente diversa
mysql sembra non digerire le with.....
sto provando qualcosa con group by e having...
ma non riesco a cavarci fuori molto :(
mysql sembra non digerire le with.....
sto provando qualcosa con group by e having...
ma non riesco a cavarci fuori molto :(
le having servono a dare condizioni alle group by...ma non credo ti servano...
io ho studiato DB2 che le distinct le implementa...senza è un tantino diverso...
ultimo tentativo: prova così :D
select pilota,time,data
from giri,table temp(pilota,time) as (SELECT nome_pilota, MIN(tempo) AS tempo FROM giri GROUP BY nome_pilota ORDER BY tempo asc)
where pilota=nome_pilota and time=tempo
ultimo tentativo: prova così :D
select pilota,time,data
from giri,table temp(pilota,time) as (SELECT nome_pilota, MIN(tempo) AS tempo FROM giri GROUP BY nome_pilota ORDER BY tempo asc)
where pilota=nome_pilota and time=tempo
intanto ti ringrazio per l'aiuto...
comunque ero arrivato anch'io ad una select nella select (piu' o meno la stessa che stai facendo tu)... ma ci sta mettendo un pelino troppo (e' un minuto che macina il mio pc!)... mi sa che mi arrangio facendo una cosa del tipo:
select id_pilota, min(tempo) from giri where id_pista = XX group by id_pilota order by min(tempo) asc limit 30;
e per ricavarmi la data in cui sono stati fatti questi 30 record, faccio una query per ognuno con qualcosa del tipo:
select data from giri where id_pista = XX and id_pilota = id_pilota_trovato_prima and tempo like tempo_trovato_prima;
e cosi dovrei risolvere...
non e' bello ma dovrebbe funzionare :D
prego di niente...comunque prova ad aspettare la risposta di qualcuno che mastica meglio mysql....sicuramente saprà darti una risposta migliore ;)
(all'università più di DB2 non abbiamo fatto..:( )
ma nn ti conviene creare una vista x questa roba ?
ma nn ti conviene creare una vista x questa roba ?
come detto io sono un povero niubbo... so a malapena cosa sia un vista :D...
comunque cosi funziona:
SELECT g1.id_pilota, g1.tempo, g1.data from giri g1 where g1.tempo = (select min(g2.tempo) from giri g2 where g2.id_pilota = g1.id_pilota and g2.id_pista = 32) and g1.id_pista = 32 order by g1.tempo, g1.id_pilota asc limit 30 ;
ma e' decisamente troppo lento (piu' di 1 minuto con tutti i miei dati)
ma nn ti conviene creare una vista x questa roba ?
avevamo provato anche con una common table expression sopra ...
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.