Schlagwort: SQL

Vorheriger und nächster Datensatz

02. November 2009

Vor und zurückEin geläufiges Problem – sich abhängig vom aktuellen Eintrag den vorherigen und nächsten Datensatz ausgeben zu lassen. Aber wie setzt man eine solche Navigation möglichst schlank und performant um? Im besten Fall kann das über ein SQL-Select Statement mit nur einer Antwort-Reihe erreicht werden.

Stimmt eigentlich nicht ganz – denn in dem einen Statement verbergen sich zwei weitere Subselects, elegant bleibt diese Lösung meines Erachtens trotzdem.
Gegeben sei ein Blog, auf dessen Artikelseite die Verweise für den jeweils nächsten und vorherigen Eintrag erscheinen sollen. Sortiert werden die Artikel über das Veröffentlichungsdatum (pup_date). Die Verweise sollen sich zusammensetzen über die ID des jeweiligen Eintrages, dem Titel und der Datumsinformation. Die zusammengesetzte SQL-Anfrage dafür:

SELECT @a:=pub_date ,
( SELECT CONCAT_WS( '|',id,title,pub_date )
  FROM blog
  WHERE pub_date < @a
  ORDER BY pub_date DESC
  LIMIT 1
) AS previous,
( SELECT CONCAT_WS( '|',id,title,pub_date )
  FROM blog
  WHERE pub_date > @a
  ORDER BY pub_date ASC
  LIMIT 1
) AS next
  FROM blog
  WHERE uid=%CURRENT_ID%

Für den Fall, dass es keinen vorherigen oder nächsten Eintrag gibt liefern previous bzw. next einfach NULL zurück. Für das Zusammensetzen der Vereise werden die über concat_ws zusammengezogenen Felder einfach wieder voneinander getrennt, und schon funktioniert die Artikelnavigation. Alles was das Statement an Informationen braucht ist die ID des aktuellen Eintrages, und für den Fall, dass die Einträge zusätzlich noch gefiltert werden – lassen sich die WHERE Bedingungen der Subselects einfach entsprechend ergänzen