Originariamente inviato da nicola75ss
Mi sembra ti serva una cosa del genere

codice:
select so1.* from stato_ordini as so1
inner join (
select *
from stato_ordini
order by id desc) as so2
on so1.id = so2.id 
group by so1.id_ordine
having so1.stato = 2
Se il risultato è quello atteso non devi far altro che un ulteriore join tra l'altra tabella e la mia query.
giusto per spaccare il capello in 4 nella seconda select basta "select id" (che è il campo del join) anzichè "select *" (fetcha l'intera riga)


EDIT: una soluzione alternativa, se gli stati sono ordinati, è una query dipendente. Attenzione che mysql le esegue molto male, comunque
questo dovrebbe funzionare e di logica piuttosto semplice

select * from ordini where id in (
select id_ordine from stato_ordini group by id_ordine having max(stato)=2)