Using ORDER BY and GROUP BY together
One way to do this that correctly uses group by
:
select l.* from table linner 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_idorder by timestamp desc
How this works:
- selects the latest timestamp for each distinct
m_id
in the subquery - only selects rows from
table
that match a row from the subquery (this operation -- where a join is performed, but no columns are selected from the second table, it's just used as a filter -- is known as a "semijoin" in case you were curious) - orders the rows
If you really don't care about which timestamp you'll get and your v_id
is always the same for a given m_i
you can do the following:
select m_id, v_id, max(timestamp) from tablegroup by m_id, v_idorder by timestamp desc
Now, if the v_id
changes for a given m_id
then you should do the following
select t1.* from table t1left join table t2 on t1.m_id = t2.m_id and t1.timestamp < t2.timestampwhere t2.timestamp is nullorder by t1.timestamp desc
Here is the simplest solution
select m_id,v_id,max(timestamp) from table group by m_id;
Group by m_id but get max of timestamp for each m_id.