0

これは私のテーブルです x

user | action

 1   |  A
 1   |  A
 1   |  B
 1   |  C
 1   |  c
 2   |  A
 2   |  B
 2   |  B

ユーザーの上位 2 つのアクションを知りたい。意味私は結果が欲しい

1 | A, C
2 | A, B ( or B, A ) 

私はいくつかの方法を試しました。

 select user , action, COUNT(*) from table where user is NOT NULL group by user, action  order by user, COUNT(*);

しかし、私は望ましい結果を得ることができません。

4

1 に答える 1

0

あなたはこのようにすることができます

SELECT user, SUBSTRING_INDEX(GROUP_CONCAT(action ORDER BY rank DESC, action), ',', 2) action
  FROM
(
  SELECT user, action, COUNT(*) rank
    FROM table1
   GROUP BY user, action
) q
 GROUP BY user

また

SELECT user, GROUP_CONCAT(action) action
  FROM
(  
  SELECT user, action, rank, @n := IF(@g = user, @n + 1, 1) rnum, @g := user
    FROM
  (
    SELECT user, action, COUNT(*) rank
      FROM table1
     GROUP BY user, action
  ) q CROSS JOIN (SELECT @n := 0, @g := NULL) i
   ORDER BY user, rank DESC, action
) q2
 WHERE rnum IN(1, 2)
 GROUP BY user

出力:

| | ユーザー | アクション |
|--------|--------|
| | 1 | A、C |
| | 2 | B、A |

これがSQLFiddleのデモです

于 2013-09-24T05:03:48.480 に答える