2011-01-11 3 views

Antwort

10

mindestens SQL Server 2005 Unter der Annahme, so können Sie die Fensterfunktion verwenden (row_number) und die CTE:

;with cteRowNumber as (
    select comment_id, user_id, comment, last_updated, ROW_NUMBER() over (partition by user_id order by last_updated desc) as RowNum 
     from comments 
) 
select comment_id, user_id, comment, last_updated 
    from cteRowNumber 
    where RowNum <= 5 
    order by user_id, last_updated desc 
+0

Danke. Ich denke, das funktioniert gut. Kann es ohne ROW_NUMBER() gemacht werden, nur mit Standard-SQL-Syntax? – myforums

+0

Sie können From cteRowNumber durch die Select-Anweisung ersetzen. – JeffO

+2

@myforums: das ** IST ** Standard ANSI SQL Syntax! –

0
SELECT TOP 5 * FROM table WHERE user_id = x ORDER BY comment_id ASC 

Ich denke, dass sollte es tun.

+0

Es wird mir die neuesten Kommentare für 1 Benutzer nur, nicht wahr? Ich brauche 5 letzte Kommentare für jeden Benutzer. – myforums

+0

"für jeden Benutzer" bedeutet wahrscheinlich, dass er Daten für * alle * Benutzer gleichzeitig wünscht, nicht nur für einen Benutzer. – dkarp

+0

würde nicht; t diese Rückkehr 5 älteste (ASC) Kommentare von ** einem Benutzer **? Solltest du nicht timestamp DESC verwenden? – Nishant

0

In SQL Server 2005 ist LIMIT nicht gültig.

Stattdessen tun so etwas wie:

SELECT TOP(5) * FROM Comment WHERE user_id = x ORDER BY comment_id ASC 

Beachten Sie, dass dies setzt voraus, dass comment_id monoton steigt, was nicht immer eine gültige Annahme für die Identitätsfelder sein kann (wenn sie beispielsweise werden neu nummeriert benötigen). Vielleicht möchten Sie ein alternatives Feld in Betracht ziehen, aber die grundlegende Struktur wäre die gleiche.

Beachten Sie, dass wenn Sie nach einem Datumsfeld bestellen würden, Sie in absteigender Reihenfolge statt aufsteigender Reihenfolge sortieren möchten, z.

SELECT TOP(5) * FROM Comment WHERE user_id = x ORDER BY last_updated DESC 
+0

"für jeden Benutzer" bedeutet wahrscheinlich, dass er Daten für * alle * Benutzer auf einmal wünscht, nicht nur für einen Benutzer. – dkarp

2

Joes Antwort ist der beste Weg, dies in SQL Server zu tun (zumindest gehe ich davon aus es ist, ich bin nicht vertraut mit CTE). Aber hier ist eine Lösung (nicht sehr schnell!) Mit Standard-SQL:

SELECT * FROM comments c1 
    WHERE (SELECT COUNT(*) FROM comments c2 
      WHERE c2.user_id = c1.user_id AND c2.last_updated >= c1.updated) <= 5 
+0

Danke auch für diese Lösung. – myforums

Verwandte Themen