Oto kolejna wersja, która współpracuje ze zmiennymi MySQL i nie wymaga głębokiego zagnieżdżania na 3 poziomach. Pierwsza z nich wstępnie sortuje rekordy w kolejności według identyfikatora postID i daty i przypisuje im kolejny numer na grupę za każdym razem, gdy zmienia się wartość jednego z identyfikatorów postu, typu i/lub akcji. Od tego, jest to proste grupowanie według... bez porównywania wersji rekordu T do T2 do T3... co jeśli chcesz 4 lub 5 kryteriów... czy musiałbyś zagnieździć jeszcze więcej wpisów?, czy po prostu dodać jeszcze 2 @ zmienne sql do testu porównawczego...
Twoje połączenie, które jest bardziej wydajne...
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
Oto mój link do przykładu SQLFiddle
W przypadku tytułu możesz dostosować linię...
group_concat( odrębne PreQuery.Title ) jako tytuły,
Przynajmniej da to DISTINCT tytuły połączone… znacznie trudniejsze do uzyskania bez zagnieżdżania całego zapytania o jeden poziom więcej, mając maksymalną datę zapytania i inne elementy, aby uzyskać jeden tytuł powiązany z tą maksymalną datą dla wszystkich kryteriów.