Per la seconda domanda ci sono vari approcci.
Te ne metto due, va scelto in funzione dell'explain
Normalmente uso la prima, ma dipende dai casi (ovvero se hai una materializzazione delle subquery dipendenti o no)
codice:
select id, visita, valore from idvisita where valore = (select min(valore) from idvisita as sub where sub.visita=idvisita.visita)
Con join hai una derivate e ti puoi beccare temporary e filesort
codice:
select esterna.* from (select visita, min(valore) as minimo from idvisita group by visita) as sub join idvisita as esterna on esterna.visita = sub.visita and esterna.valore = sub.minimo
Comunque spero che la logica sia abbastanza evidente (e di aver capito la domanda
)