4 Stimmen

Wie wählt man "vorherige" und "nächste" Datensätze in SQL aus?

Ich baue eine Blog-Post-Detailseite auf meiner Website, die eine ' vorherige ' und ' nächste Link, ähnlich wie ein Typepad-Blogbeitrag funktioniert. Siehe Beispiel unten. alt text

Ich frage mich, ob es eine Möglichkeit gibt, die Datenbank abzufragen, die so etwas wie das folgende Bild erreicht, in dem der "aktuelle" Datensatz (in gelb) für die Anzeige ausgewählt wird, aber auch die nächsten und vorherigen Datensätze (in grün) ausgewählt werden, wenn sie nach Veröffentlichungsdatum sortiert sind.

alt text

Zur Klarstellung: Die Datenbanktabelle, mit der ich arbeite, hat eindeutige Veröffentlichungsdaten. Es tut mir leid, dass das Beispielbild mehrere Datensätze mit demselben Veröffentlichungsdatum zeigt.

11voto

TomTom Punkte 1

Das tun Sie nicht. SQL hat kein vorheriges, nächstes Konzept. Sie fragen im Grunde nach der nächsten Top 1 in einer geordneten Abfrage (z. B. nach Datum) nach der, die Sie bereits haben. Dies bedeutet, dass Sie eine Reihenfolge (durch order by-Anweisung) für die Filterung haben / impostieren müssen.

4voto

Thomas Punkte 62314

Sie brauchen eine Möglichkeit, die Beiträge zu ordnen. Wenn Sie diese Möglichkeit haben, können Sie in SQL Server 2005+ etwas wie das Folgende tun, wobei Sie die gewünschte Positionsnummer eingeben:

With OrderedPosts As
    (
    Select ...
        , ROW_NUMBER() OVER ( ORDER BY PublishDate ) As ItemRank
    From ..
    Where ...
    )
Select
From OrderedPosts
Where ItemRank = @ItemNumber

Im Code der Website müssten Sie verfolgen, bei welcher Nummer Sie sich gerade befinden, und dann eine subtrahieren und neu abfragen, um die vorherige Nummer zu erhalten, oder eine addieren und neu abfragen, um die nächste zu erhalten.

Wenn Sie in einer einzigen Abfrage die nächste und die vorherige Abfrage zusammen mit der aktuellen Abfrage benötigen, könnten Sie etwas wie folgt tun:

With OrderedPosts As
    (
    Select ...
        , ROW_NUMBER() OVER ( ORDER BY PublishDate ) As ItemRank
    From ..
    Where ...
    )
Select
From OrderedPosts
Where ItemRank Between (@ItemNumber - 1) And (@ItemNumber + 1)

1voto

Eelze Wijma Punkte 21

Basierend auf der Antwort von Thomas könnten Sie folgendes tun: Die @Id ist die GUID, mit der Sie einen eindeutigen Eintrag haben.

With OrderedPosts As
    (
    Select Id
        , Title
        , PublishDate
        , ROW_NUMBER() OVER ( ORDER BY PublishDate ) As ItemRank
    From Posts
    )
Select top 3 *
From OrderedPosts
Where ItemRank > (select ItemRank from OrderedPosts where Id = @Id) - 2

0voto

Namit Punkte 331

Siehe folgenden Artikel bei microsoft tech net

http://social.technet.microsoft.com/wiki/contents/articles/23811.paging-a-query-with-sql-server.aspx

Hoffentlich hilft das

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X