如何折叠相邻的行,按一些列分组?

时间:2017-08-23 11:30:11

标签: mysql select group-by

我希望通过每个用户的消息从某些聊天中获取统计信息。但我想分组相邻的消息。如果用户逐个写入3条消息,则将其视为一条消息。 例如,我有这些记录:

id  user   message
 1   1      text1
 2   1      text2 
 3   2      text3
 4   3      text4
 5   1      text5
 6   2      text6
 7   2      text7
 8   3      text8
 9   1      text9
10   1      text10
11   1      text11
12   3      text12

我需要得到这个结果:

user
  1
  2
  3
  1
  2
  3
  1
  3

我希望通过折叠邮件获取子查询结果,然后使用“group by”运行查询以获取所有统计信息。

我试图运行

SELECT * FROM messages GROUP BY user ORDER BY id

但它由一个用户对所有消息进行分组:

id   user
 1    1
 3    2
 4    3

1 个答案:

答案 0 :(得分:1)

E.g。 (虽然在实践中我很想在应用程序代码中解决这类问题):

SELECT MAX(user) user
     , i
  FROM 
     ( SELECT user
            , CASE WHEN @prev = user THEN @i:=@i ELSE @i:=@i+1 END i
            , @prev:=user
         FROM my_table
            , (SELECT @prev:=null, @i:=0) vars
        ORDER 
           BY id
     ) x
 GROUP 
    BY i;

...或

SELECT DISTINCT user, i
  FROM 
     ( SELECT user
            , CASE WHEN @prev = user THEN @i:=@i ELSE @i:=@i+1 END i
            , @prev:=user
         FROM my_table
            , (SELECT @prev:=null, @i:=0) vars
        ORDER 
           BY id
     ) x
 ORDER
    BY i;