[Db] query quiz

Marcello Vezzelli marcello a vezz.it
Mar 20 Mar 2007 13:47:26 CET


Domenico L. ha scritto:
> io avrei approcciato così (puoi anche sostituire dataora con 
> rif_risposte):
>
>
> select r.descrizione, s.*
> from risposte s, richieste r
> where ( rif_utente, rif_domanda, dataora) in
>            (
>                select rif_utente, rif_domanda, min(dataora)
>                from risposte
>                where rif_utente=1
>                group by rif_utente, rif_domanda
>            )
>
>          and r.id=s.rif_domanda
>  
> (non so se su mysql questa sintassi è supportata, però al limite si 
> rigira con una join )

Premetto che la soluzione che ho postato funziona, e ho anche capito 
perché...
però mi interessava anche capire il tuo approccio.

Non ho capito a cosa serve min(dataora).

Ho fatto questa cosa... ho "taroccato" gli id in modo che ci sia un 
dataora minore di un record precedente (vedi record 8).
In questa condizione, la mia soluzione non funziona più.

Se ora faccio

SELECT * , min( dataora )
FROM utilizzo
WHERE rif_codice =1
GROUP BY rif_codice, rif_domanda

mi torna questo:

id 
<http://10.0.0.125:8000/sql.php?db=didacom&table=utilizzo&token=a3b847b9ede0d142ff7621943c1e70db&pos=0&session_max_rows=30&disp_direction=horizontal&repeat_cells=100&dontlimitchars=0&sql_query=SELECT+%2A%2C+min%28dataora+%29+FROM+utilizzo++WHERE+rif_codice+%3D1++GROUP+BY+rif_codice+%2C+rif_domanda++ORDER+BY+%60utilizzo%60.%60id%60+ASC> 
	rif_codice 
<http://10.0.0.125:8000/sql.php?db=didacom&table=utilizzo&token=a3b847b9ede0d142ff7621943c1e70db&pos=0&session_max_rows=30&disp_direction=horizontal&repeat_cells=100&dontlimitchars=0&sql_query=SELECT+%2A%2C+min%28dataora+%29+FROM+utilizzo++WHERE+rif_codice+%3D1++GROUP+BY+rif_codice+%2C+rif_domanda++ORDER+BY+%60utilizzo%60.%60rif_codice%60+ASC> 
	rif_domanda 
<http://10.0.0.125:8000/sql.php?db=didacom&table=utilizzo&token=a3b847b9ede0d142ff7621943c1e70db&pos=0&session_max_rows=30&disp_direction=horizontal&repeat_cells=100&dontlimitchars=0&sql_query=SELECT+%2A%2C+min%28dataora+%29+FROM+utilizzo++WHERE+rif_codice+%3D1++GROUP+BY+rif_codice+%2C+rif_domanda++ORDER+BY+%60utilizzo%60.%60rif_domanda%60+ASC> 
	rif_risposta 
<http://10.0.0.125:8000/sql.php?db=didacom&table=utilizzo&token=a3b847b9ede0d142ff7621943c1e70db&pos=0&session_max_rows=30&disp_direction=horizontal&repeat_cells=100&dontlimitchars=0&sql_query=SELECT+%2A%2C+min%28dataora+%29+FROM+utilizzo++WHERE+rif_codice+%3D1++GROUP+BY+rif_codice+%2C+rif_domanda++ORDER+BY+%60utilizzo%60.%60rif_risposta%60+ASC> 
	dataora 
<http://10.0.0.125:8000/sql.php?db=didacom&table=utilizzo&token=a3b847b9ede0d142ff7621943c1e70db&pos=0&session_max_rows=30&disp_direction=horizontal&repeat_cells=100&dontlimitchars=0&sql_query=SELECT+%2A%2C+min%28dataora+%29+FROM+utilizzo++WHERE+rif_codice+%3D1++GROUP+BY+rif_codice+%2C+rif_domanda++ORDER+BY+%60utilizzo%60.%60dataora%60+ASC> 
	attesa 
<http://10.0.0.125:8000/sql.php?db=didacom&table=utilizzo&token=a3b847b9ede0d142ff7621943c1e70db&pos=0&session_max_rows=30&disp_direction=horizontal&repeat_cells=100&dontlimitchars=0&sql_query=SELECT+%2A%2C+min%28dataora+%29+FROM+utilizzo++WHERE+rif_codice+%3D1++GROUP+BY+rif_codice+%2C+rif_domanda++ORDER+BY+%60utilizzo%60.%60attesa%60+ASC> 
	min( dataora ) 
<http://10.0.0.125:8000/sql.php?db=didacom&table=utilizzo&token=a3b847b9ede0d142ff7621943c1e70db&pos=0&session_max_rows=30&disp_direction=horizontal&repeat_cells=100&dontlimitchars=0&sql_query=SELECT+%2A%2C+min%28dataora+%29+FROM+utilizzo++WHERE+rif_codice+%3D1++GROUP+BY+rif_codice+%2C+rif_domanda++ORDER+BY+%60utilizzo%60.%60min%28+dataora+%29%60+ASC> 

1 	1 	47 	1 	2007-03-19 09:51:30 	4.22 	2007-03-19 09:51:30
4 	1 	48 	6 	2007-03-19 10:07:37 	12.61 	2007-03-19 09:51:48
7 	1 	49 	8 	2007-03-19 09:52:21 	4.11 	2007-03-19 09:52:21



Nel record 4, dataora e min(dataora) sono diversi... effettivamente 
doveva tornarmi l'id 8, non il 4!

con una SELECT liscia,
SELECT *
FROM utilizzo
WHERE rif_codice =1

id 
<http://10.0.0.125:8000/sql.php?db=didacom&table=utilizzo&token=a3b847b9ede0d142ff7621943c1e70db&pos=0&session_max_rows=30&disp_direction=horizontal&repeat_cells=100&dontlimitchars=0&sql_query=SELECT+%2A+FROM+utilizzo++WHERE+rif_codice+%3D1+++ORDER+BY+%60utilizzo%60.%60id%60+ASC> 
	rif_codice 
<http://10.0.0.125:8000/sql.php?db=didacom&table=utilizzo&token=a3b847b9ede0d142ff7621943c1e70db&pos=0&session_max_rows=30&disp_direction=horizontal&repeat_cells=100&dontlimitchars=0&sql_query=SELECT+%2A+FROM+utilizzo++WHERE+rif_codice+%3D1+++ORDER+BY+%60utilizzo%60.%60rif_codice%60+ASC> 
	rif_domanda 
<http://10.0.0.125:8000/sql.php?db=didacom&table=utilizzo&token=a3b847b9ede0d142ff7621943c1e70db&pos=0&session_max_rows=30&disp_direction=horizontal&repeat_cells=100&dontlimitchars=0&sql_query=SELECT+%2A+FROM+utilizzo++WHERE+rif_codice+%3D1+++ORDER+BY+%60utilizzo%60.%60rif_domanda%60+ASC> 
	rif_risposta 
<http://10.0.0.125:8000/sql.php?db=didacom&table=utilizzo&token=a3b847b9ede0d142ff7621943c1e70db&pos=0&session_max_rows=30&disp_direction=horizontal&repeat_cells=100&dontlimitchars=0&sql_query=SELECT+%2A+FROM+utilizzo++WHERE+rif_codice+%3D1+++ORDER+BY+%60utilizzo%60.%60rif_risposta%60+ASC> 
	dataora 
<http://10.0.0.125:8000/sql.php?db=didacom&table=utilizzo&token=a3b847b9ede0d142ff7621943c1e70db&pos=0&session_max_rows=30&disp_direction=horizontal&repeat_cells=100&dontlimitchars=0&sql_query=SELECT+%2A+FROM+utilizzo++WHERE+rif_codice+%3D1+++ORDER+BY+%60utilizzo%60.%60dataora%60+ASC> 
	attesa 
<http://10.0.0.125:8000/sql.php?db=didacom&table=utilizzo&token=a3b847b9ede0d142ff7621943c1e70db&pos=0&session_max_rows=30&disp_direction=horizontal&repeat_cells=100&dontlimitchars=0&sql_query=SELECT+%2A+FROM+utilizzo++WHERE+rif_codice+%3D1+++ORDER+BY+%60utilizzo%60.%60attesa%60+ASC> 

1 	1 	47 	1 	2007-03-19 09:51:30 	4.22
4 	1 	48 	6 	2007-03-19 10:07:37 	12.61
5 	1 	47 	3 	2007-03-19 13:05:10 	3.03
6 	1 	48 	7 	2007-03-19 13:05:38 	14.77
7 	1 	49 	8 	2007-03-19 09:52:21 	4.11
8 	1 	48 	5
	2007-03-19 09:51:48 	3.8



Mi chiedo.. a cosa serve min(dataora)? Non influisce sul recordset 
finale, tant'è che coincide con la mia soluzione.

Alla fine è il GROUP BY che mi dà i primi record che mi servono.
e funziona SOLO se l'id è ordinato come le date (e infatti è così).

Se c'è un id successivo a un altro ma che però ha dataora precedente, il 
gioco non funziona più e min(dataora) non mi aiuta.

Ti torna tutto?

Saluti
Marcello



Maggiori informazioni sulla lista Db