PDA

View Full Version : [sql][newbie] migliori tempi sul giro di ogni pilota


HexDEF6
04-02-2008, 14:13
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

HexDEF6
04-02-2008, 15:19
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)

0rph3n
04-02-2008, 16:47
SELECT nome_pilota, MIN(tempo) AS tempo FROM giri GROUP BY nome_pilota ORDER BY tempo asc

HexDEF6
04-02-2008, 17:47
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 :)

ally
05-02-2008, 11:34
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...

HexDEF6
05-02-2008, 12:55
...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)

NeoNum6
05-02-2008, 14:07
SELECT nome_pilota, MIN(tempo) AS tempo,data FROM giri GROUP BY nome_pilota,data ORDER BY tempo,data asc

prova così ;)

HexDEF6
05-02-2008, 14:15
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

NeoNum6
05-02-2008, 14:28
niente da fare :(
mi da i doppioni come se non gruppassi

cosa ti torna esattamente?i doppioni in nome? in mysql la 'with' funziona?

HexDEF6
05-02-2008, 14:45
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)

NeoNum6
05-02-2008, 14:56
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)

NeoNum6
05-02-2008, 15:00
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

HexDEF6
05-02-2008, 15:24
mysql sembra non digerire le with.....

sto provando qualcosa con group by e having...
ma non riesco a cavarci fuori molto :(

NeoNum6
05-02-2008, 15:27
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...

NeoNum6
05-02-2008, 15:30
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

HexDEF6
05-02-2008, 15:51
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

NeoNum6
05-02-2008, 15:54
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..:( )

vladix
06-02-2008, 09:47
ma nn ti conviene creare una vista x questa roba ?

HexDEF6
06-02-2008, 09:49
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)

NeoNum6
06-02-2008, 09:55
ma nn ti conviene creare una vista x questa roba ?

avevamo provato anche con una common table expression sopra ...