Non è affatto semplice, e potrei anche averla complicata più del necessario. Così però dovrebbe andare
codice:
s*lect pv.patient, p.name, pv.datavisita, stato from patients_visits pv join
(
    S*LECT patient, max(datavisita) as datavisita FROM `patients_visits` group by patient
) as t1
on pv.patient = t1.patient and pv.datavisita = t1.datavisita
left join patients p on pv.patient = p.id
Attenzione che i nomi delle colonne non corrispondono ai tuoi, e anche in patients_visits c'è una s in più