Hallo Arne,
wenn Du denn ganz sicher bist, dass die IDs fortlaufend sind, könntest Du das mit einer Addition machen. Dagegen gibt es aber zwei Einwände.
- formal: IDs sollten unsprechend sein, d.h. auch kein fortlaufende Reihenfolge bestimmen.
- technisch: Was ist, wenn ein Seminar gelöscht wurde? Dann fehlt eine ID und der Link geht ins Leere. IDs reorganisieren? Denk nicht mal dran. IDs sind unveränderlich. Und es gibt auch andere Umstände, unter denen IDs nicht fortlaufend sind.
Deshalb: nicht machen!
Ich würde mutmaßen, dass deine Seminare nach einem fachlichen Schlüssel sortierbar sein sollten, und gemäß dieses fachlichen Schlüssels sollte auch vor/zurück funktionieren.
D.h. beim Aufbereiten der Seite mit ID=3 musst Du ermitteln, welche Seminare in der logischen Reihenfolge der aktuellen Seite vorangehen und nachfolgen. Ich würde annehmen, dass Du auf einem XAMP System unterwegs bist und demnach PHP und MYSQL verwendest.
Irgendwo in deinem seminar-detail.php Script wird also ein MYSQL-Aufruf stehen, der Dir die anzuzeigenden Detailinformationen zum Seminar mit der geforderten ID beschafft. In diesem Aufruf solltest Du die IDs des vorigen und nächsten Seminars ermitteln.
Das kann man mit zwei Subselects machen, die man dem SELECT für die Details hinzufügt. Damit das nicht langsam wird, muss auf der Spalte name ein Index liegen.
SELECT s.id, s.name, s.column3, ..., s.columnN
, (select id from seminare s1
where s1.name < s.name order by s1.name desc limit 1) as prev_id
, (select id from seminare s2
where s2.name > s.name order by s2.name limit 1) as next_id
FROM seminare s
where id = ?
So entstehen die Spalten prev_id und next_id, die NULL sind, falls das angezeigte Seminar das erste, letzte oder einzige in der Liste ist, und andernfalls die für das Blättern benötigte ID enthalten.
Auf diese Weise bekommst Du allerdings nur die ID, nicht den Namen des vorigen und nächsten Seminars. Wenn Du die auch brauchst, stößt Du auf Probleme.
- Subselects können immer nur eine Spalte liefern. Braucht man mehr, muss man LEFT JOIN verwenden
- Aber es gibt keine direkte SQL Formulierung für "joine nur eine Row von mehreren".
- Man kann das über einen zugejointen Tabellenausdruck lösen. Aber innerhalb dieses Ausdrucks sind die Spalten der primären Table nicht bekannt und du kannst keine Namen vergleichen.
Meine Empfehlung wäre daher ein eigenständiges zweites SQL, um ID und NAME von vorigem und näcshtem Seminar zu bekommen.
SELECT p.id as prev_id, p.name as prev_name, n.id as next_id, n.name as next_name
FROM (SELECT id, name FROM seminare WHERE name < ? ORDER BY name DESC LIMIT 1) p,
(SELECT id, name FROM seminare WHERE name > ? ORDER BY name LIMIT 1) n
Dieser Query-Vorschlag oben macht zwei Index-Seeks (vorausgesetzt dass auf der Spalte Name ein Index liegt) und ist damit ziemlich fix.
Ich habe es auch mit einem UNION probiert - aber dann sagt mir EXPLAIN, dass der zweite SELECT im UNION den Index nicht verwendet. Sehr merkwürdig, vielleicht ein Bug in dem MYSQL 5.6 das ich hier herumliegen habe.
Rolf
sumpsi - posui - clusi