Obtener los últimos n loggings para cada grupo

Digamos que tengo la siguiente tabla:

id coulmn_id value date 1 10 'a' 2016-04-01 1 11 'b' 2015-10-02 1 12 'a' 2016-07-03 1 13 'a' 2015-11-11 2 11 'c' 2016-01-10 2 23 'd' 2016-01-11 3 11 'c' 2016-01-09 3 111 'd' 2016-01-11 3 222 'c' 2016-01-10 3 333 'd' 2016-01-11 

para n = 3, quiero get los últimos n loggings <= 3 para cada id. Entonces tendré el siguiente resultado:

 id column_id value date 1 10 'a' 2016-04-01 1 12 'a' 2016-07-03 1 13 'a' 2015-11-11 2 11 'c' 2016-01-10 2 23 'd' 2016-01-11 3 111 'd' 2016-01-11 3 222 'c' 2016-01-10 3 333 'd' 2016-01-11 

Estoy respondiendo porque la pregunta a la que se hace reference tiene una respuesta inestable (lo comentaré allí).

Aquí hay una solución que debería funcionar:

 select t.* from (select t.*, (@rn := if(@id = id, @rn + 1, if(@id := id, 1, 1) ) ) as seqnum from t cross join (select @rn := 0, @id := -1) params order by id, date desc ) t where seqnum <= 3; 

La diferencia en las soluciones es que las asignaciones variables están todas en una sola expresión. MySQL no garantiza el order de evaluación de las expresiones, por lo que es muy importante si el código va a funcionar de manera coherente.

Puedes hacer esto con el uso de variables. Primero revise los resultados en order inverso y asigne un número de fila, luego filtre los resultados para numbers de fila less o igual a 3, y vuelva a orderar:

 select id, value, date from ( select id, value, date, @rn := if(@id = id, @rn+1, if (@id := id, 1, 1)) rn from mytable, cross join (@id := null, @rn := null) init order by id, date desc ) as base where rn <= 3 order by id, date asc