Mysql
 sql >> Base de données >  >> RDS >> Mysql

Grouper MySQL par lignes consécutives

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.