Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Grupo MySQL por linhas consecutivas


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.