2017-08-23 3 views
0

1人のメッセージでいくつかのチャットから統計を取得したい。しかし、私は隣接するメッセージをグループ化したい。ユーザーが3つのメッセージを1つずつ書き込むと、1つとカウントされます。 は例えば、私はこれらのレコードを持っている:隣接する行を折りたたみ、いくつかの列でグループ化する方法は?

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 

私は折りたたまれたメッセージを持つサブクエリの結果を取得し、取得するための「によってグループ」でクエリを実行することを期待しますすべての統計。例えば

id user 
1 1 
3 2 
4 3 
+2

* *「私はグループの隣接するメッセージにしたい」 - ではありませんSQLのためのかなりの仕事。 SQLは個々のアイテムではなく、セットで動作し、[セット](https://en.wikipedia.org/wiki/Set_(数学))は、非常に定義すると、順序付けされていないアイテムの集合です。ただし、[MySQL変数](https://dev.mysql.com/doc/refman/5.7/en/set-variable.html)を使用して行うことができます。 – axiac

答えて

1

私は

SELECT * FROM messages GROUP BY user ORDER BY id 

を実行しようとしたが、それのグループ1人のユーザーによるすべてのメッセージを(実際には、私は、アプリケーションコードにこの種の問題を解決するために誘惑されると思いますが):

SELECT MAX(user) user 
    , i 
    FROM 
    (SELECT user 
      , CASE WHEN @prev = user THEN @i:[email protected] ELSE @i:[email protected]+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:[email protected] ELSE @i:[email protected]+1 END i 
      , @prev:=user 
     FROM my_table 
      , (SELECT @prev:=null, @i:=0) vars 
     ORDER 
      BY id 
    ) x 
ORDER 
    BY i; 
関連する問題