Mysql
 sql >> Database >  >> RDS >> Mysql

Gruppo MySQL per righe consecutive

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.