[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