2013-10-03 12 views
5

ich diesen Artikel gelesen haben: http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/ und für andere Fragen suchenmysql wählen Sie die ersten n Zeilen pro Gruppe

Ich habe eine Tabelle, die so etwas wie ist:

| 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 

Ich versuche zu bekommen Die Anzahl von table.id, gruppiert nach user.id, und wenn die Anzahl von user.id größer als 7 ist, wird das Ergebnis nur als 7 angezeigt (aka Begrenzung der Anzahl der Ergebnisse auf 7).

In diesem Beispiel sollte das Ergebnis sein:

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

Ich habe versucht:

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

und

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 

Antwort

6

Sie Ihre Anfrage vereinfachen kann, und Verwenden Sie LEAST Funktion

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

von der Frage in Ihrem Kommentar

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

SqlFiddle

+0

funktioniert super! Und sehr einfach. Wie würde ich die SUMME dieser COUNT-Spalte erhalten? Ich versuchte SELECT Benutzer-ID, SUMME (SELECT LEAST (7, COUNT (*)) FROM Tabelle GROUP BY USERid) FROM Tabelle, obwohl dies zu einem Fehler führte – Ken

+0

Ja die Summe dieser Zähler Spalte. Im ursprünglichen Beispiel wäre die Summe der Zählspalte mit dem Limit von 7 Ergebnissen max = 29 – Ken

+0

@Phil siehe bearbeiten dann –

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 
Verwandte Themen