Ecco un'altra versione che funziona con le variabili MySQL e non richiede 3 livelli di nidificazione in profondità. Il primo preordina i record in ordine per postID e Data e assegna loro un numero sequenziale per gruppo ogni volta che un valore cambia in uno dei Post ID, Tipo e/o azione. Da quello, è un semplice gruppo per... senza confrontare la versione del record T con T2 e T3... e se volessi 4 o 5 criteri... dovresti annidare ancora più voci?, o semplicemente aggiungere altri 2 @ variabili sql al test di confronto...
La tua chiamata su quale è più efficiente...
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
Ecco il mio link all'esempio di SQLFiddle
Per il titolo, potresti voler regolare la linea...
group_concat( distinto PreQuery.Title ) come Titoli,
Almeno questo darà titoli DISTINCT concatenati... molto più difficile da lasciare senza annidare l'intera query di un livello in più avendo la data massima della query e altri elementi per ottenere l'unico titolo associato a quella data massima per tutti i criteri.