2013-10-03 89 views
5

第n行我讀過這篇文章:http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/和搜索等問題MySQL的選擇每

我有一個表是這樣的:

| table.id | USER.id 
---------------------------------------------- 
| 1   | 101 
| 2   | 101 
| 3   | 101 
| 4   | 101 
| 5   | 101 
| 6   | 101 
| 7   | 101 
| 8   | 101 
| 9   | 101 
| 10   | 101 
| 11   | 102 
| 12   | 102 
| 13   | 102 
| 14   | 102 
| 15   | 103 
| 16   | 103 
| 17   | 103 
| 18   | 103 
| 19   | 103 
| 20   | 103 
| 21   | 103 
| 22   | 103 
| 23   | 103 
| 24   | 104 
| 25   | 104 
| 26   | 104 
| 27   | 104 
| 28   | 104 
| 29   | 104 
| 30   | 105 
| 31   | 105 
| 32   | 105 
| 33   | 106 
| 34   | 106 

我試圖讓table.id的計數由user.id分組,並且如果user.id的計數大於7,則只顯示結果爲7(即將計數結果限制爲7)。

在這個例子中,結果應該是:

| USER.id   | count of table.ID 
---------------------------------------- 
| 101    | 7 
| 102    | 4 
| 103    | 7 
| 104    | 6 
| 105    | 3 
| 106    | 2 

我已經試過:

SELECT USERid, COUNT(table.id) 
FROM table 
WHERE table.id IN (select top 7 table.id from table) 
GROUP BY USERid 

SELECT USERid, COUNT(table.id) 
FROM table 
WHERE (
    SELECT COUNT(table.ID) FROM table as t 
    WHERE t.id = t.id AND t.USERid <= table.USERid 
    ) <= 7 
GROUP BY USERid 

回答

6

您可以簡化您的查詢,使用LEAST函數

SELECT USERid, LEAST(7, COUNT(*)) 
FROM table 
GROUP BY USERid 

從這個問題在您的評論

SELECT SUM(countByUser) 
FROM 
(SELECT LEAST(7, COUNT(*)) as countByUser 
    FROM table 
    GROUP BY USERid) c 

SqlFiddle

+0

偉大的作品!而且非常簡單。我將如何獲得該COUNT列的總和?我嘗試了SELECT userid,SUM(SELECT FROM LEAST(7,COUNT(*))FROM TABLE GROUP BY USERID)FROM table,儘管這導致錯誤 – Ken

+0

是計數列的總和。在原始示例中,計數列與7個結果max的限制之和應爲= 29 – Ken

+0

@Phil請參閱編輯然後 –

0
SELECT USERid, case when COUNT(table.id) > 7 
        then 7 
        else COUNT(table.id) 
       end 
FROM table 
GROUP BY USERid 
0
SELECT userid, 
CASE 
    WHEN COUNT(*) > 7 THEN 7 
    ELSE COUNT(*) 
END AS Qty 
FROM tbl 
GROUP BY userid