2013-09-24 48 views
0

這是我的表XSQL進行前2重複值

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(*); 

,但我不能得到期望的結果。

+1

什t是*前2個動作*?爲什麼不是用戶1的A和B? – hims056

+0

用戶1做了兩次動作A和C並且動作B一次,因此A和C是前兩個動作 – iamkhush

回答

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 

輸出:

 
| USER | ACTION | 
|------|--------| 
| 1 | A,C | 
| 2 | B,A | 

這裏是SQLFiddle演示

+0

謝謝,完美的工作 – iamkhush