Voici une autre version qui fonctionne avec les variables MySQL et ne nécessite pas d'imbrication à 3 niveaux. Le premier pré-trie les enregistrements dans l'ordre par postID et Date et leur attribue un numéro séquentiel par groupe chaque fois qu'une valeur change dans l'un des Post ID, Type et/ou action. À partir de là, c'est un simple regroupement par... pas de comparaison de la version d'enregistrement T à T2 à T3... et si vous vouliez 4 ou 5 critères... devriez-vous imbriquer encore plus d'entrées ?, ou simplement ajouter 2 autres @ variables sql au test de comparaison...
Votre appel sur lequel est le plus efficace...
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
Voici mon lien vers l'exemple SQLFiddle
Pour le titre, vous voudrez peut-être ajuster la ligne...
group_concat( distinct PreQuery.Title ) as Titles,
Au moins, cela donnera des titres DISTINCT concaténés... beaucoup plus difficiles à obtenir sans imbriquer toute cette requête d'un niveau de plus en ayant la date de requête maximale et d'autres éléments pour obtenir le seul titre associé à cette date maximale selon tous les critères.