方法一

select * 
from messages 
where
id in (
  select max(id)
  fom messages 
  group by name
);

-- 优化
select b.* 
from
  (select max(`id`) as id from `messages` group by `name`) as a
join `messages` as b on a.id = b.id;

方法二

select m1.* 
from messages m1 
left join messages m2 on m1.name = m2.name and m1.id < m2.id
where 
m2.id is null;

方法三

SELECT * FROM `messages` GROUP BY name DESC