Jednym ze sposobów na zrobienie tego, który poprawnie używa group by
:
select l.*
from table l
inner join (
select
m_id, max(timestamp) as latest
from table
group by m_id
) r
on l.timestamp = r.latest and l.m_id = r.m_id
order by timestamp desc
Jak to działa:
- wybiera ostatni znacznik czasu dla każdego odrębnego
m_id
w podzapytaniu - wybiera tylko wiersze z
table
które pasują do wiersza z podzapytania (ta operacja -- gdzie wykonywane jest sprzężenie, ale nie są wybierane żadne kolumny z drugiej tabeli, jest ona po prostu używana jako filtr -- jest znana jako "semijoin" na wypadek, gdybyś był ciekawy) - porządkuje wiersze