mysql分组取最新一条

一般思路

group后取max(id),然后select * from table where id in (XX);或者是直接join,取最小id;但是这个有个问题,效率非常低。

  1. SELECT
  2. count( 0 )
  3. FROM
  4. ( SELECT * FROM table_name ) m1
  5. LEFT JOIN table_name m2 ON ( m1.business_id = m2.business_id AND m1.id < m2.id )
  6. WHERE
  7. m2.id IS NULL;

更好的解决方法

mysql有默认group的取值,经过验证,默认是按id正序取第一条。但我们需要取最新一条怎么办?嵌套做子查询,先将表倒叙排号,再按mysql group默认取即可;
对于5.7之前得版本:

  1. select * from (
  2. select * from table_name order by create_time desc
  3. ) as t
  4. group by t.business_id;

5.7之后需要加入limit,否则不生效:

  1. select * from (
  2. select * from table_name order by create_time desc limit 100000
  3. ) as t
  4. group by t.business_id;

经过测试,相同得表(4000条数据),联表的解决方法耗时5-6000ms,以上的解决方法在50ms内;