2015-09-30 26 views
1

我已經根據列字段爲我的表分組,並同時顯示每個組的計數值。 例如在sql查詢中返回前3個計數值

user | count(user) 
user 1 |  4 
user 2 |  3 
user 3 |  3 
user 4 |  3 
user 5 |  2 

現在我需要只顯示前3用戶計數4.

我已經寫分組邏輯這種情況下用戶1,用戶2,用戶3,用戶但當我嘗試訂購然後將結果限制爲3(限制3),我只得到用戶1,2和3.這是不正確的,因爲用戶4也進入前3計數。

+0

請測試它:SELECT'user',COUNT('user')FROM'table' GROUP BY'user' HAVING MAX COUNT('用戶') –

+1

這是[標籤:mysql]還是[標籤:sqlite]? – Mureinik

回答

1

首先用獨立確定臨界值選擇這將是(用於MySQL的)更容易:

SELECT MIN(cnt) 
INTO @min 
FROM (
    SELECT COUNT(*) cnt 
    FROM Table 
    GROUP BY user 
    ORDER BY cnt DESC 
    LIMIT 3 
) t; 

SELECT user, COUNT(*) usercount 
FROM Table 
GROUP BY user 
HAVING usercount>= @min 
ORDER BY usercount DESC; 

另見http://sqlfiddle.com/#!9/6d749/2

1

這應做到:

選擇用戶,計數(1)來自用戶組,具有計數(用戶)> =(從用戶組中選擇計數(1)按用戶順序計數(用戶)限制2,1 )按次數(用戶)

Example table: 
mysql> select * from users; 
+----+-------+ 
| id | user | 
+----+-------+ 
| 1 | user1 | 
| 3 | user3 | 
| 4 | user4 | 
| 5 | user5 | 
| 6 | user1 | 
| 7 | user2 | 
| 8 | user2 | 
| 9 | user2 | 
| 10 | user2 | 
| 11 | user1 | 
| 12 | user5 | 
| 13 | user5 | 
| 14 | user6 | 
| 15 | user6 | 
| 16 | user6 | 
+----+-------+ 
15 rows in set (0.00 sec) 


mysql> select user, count(1) from users group by user having count(user) >= (select count(1) from users group by user order by count(user) desc limit 2, 1) order by count(user) desc; 
+-------+----------+ 
| user | count(1) | 
+-------+----------+ 
| user2 |  4 | 
| user1 |  3 | 
| user5 |  3 | 
| user6 |  3 | 
+-------+----------+ 
4 rows in set (0.00 sec) 

所以訣竅是弄清楚第三最高計數值是什麼。然後獲得所有具有> =的計數的用戶(因此它包括並列第三名的用戶)。

帶有LIMIT 2,1的子查詢用於獲取第三高的計數值。所以你可以使用限制4,1如果你想要5而不是3。