Aqui está outra versão que funciona com variáveis do MySQL e não requer aninhamento de 3 níveis de profundidade. A primeira pré-ordena os registos por postID e Date e atribui-lhes um número sequencial por grupo sempre que um valor muda num dos Post ID, Type e/ou action. A partir disso, é um grupo simples por... sem comparar a versão de registro T com T2 com T3... e se você quisesse 4 ou 5 critérios... você teria que aninhar ainda mais entradas?, ou apenas adicionar mais 2 @ variáveis sql para o teste de comparação...
Sua chamada em que é mais eficiente...
select
PreQuery.postID,
PreQuery.PostType,
PreQuery.Target,
PreQuery.Action,
PreQuery.Title,
min( PreQuery.Date ) as FirstActionDate,
max( PreQuery.Date ) as LastActionDate,
count(*) as ActionEntries,
group_concat( PreQuery.content ) as Content
from
( select
t.*,
@lastSeq := if( t.action = @lastAction
AND t.postID = @lastPostID
AND t.postType = @lastPostType, @lastSeq, @lastSeq +1 ) as ActionSeq,
@lastAction := t.action,
@lastPostID := t.postID,
@lastPostType := t.PostType
from
t,
( select @lastAction := ' ',
@lastPostID := 0,
@lastPostType := ' ',
@lastSeq := 0 ) sqlVars
order by
t.postid,
t.date ) PreQuery
group by
PreQuery.postID,
PreQuery.ActionSeq,
PreQuery.PostType,
PreQuery.Action
Aqui está meu link para amostra do SQLFiddle
Para o título, você pode querer ajustar a linha...
group_concat( distinct PreQuery.Title ) como Títulos,
Pelo menos isso dará títulos DISTINCT concatenados ... muito mais difícil de deixar sem aninhar essa consulta inteira mais um nível, tendo a data máxima da consulta e outros elementos para obter o título associado a essa data máxima por todos os critérios.