Angenommen, ich habe Datensätze mit den IDs 3,4,7,9 und möchte durch Navigation über die nächsten / vorherigen Links von einem zum anderen wechseln können. Das Problem ist, dass ich nicht weiß, wie ich einen Datensatz mit der nächsthöheren ID abrufen soll.
Wenn ich also einen Datensatz mit der ID 4 habe, muss ich in der Lage sein, den nächsten vorhandenen Datensatz abzurufen, nämlich 7. Die Abfrage würde wahrscheinlich ungefähr so aussehen
SELECT * FROM foo WHERE id = 4 OFFSET 1
Wie kann ich den nächsten / vorherigen Datensatz abrufen, ohne die gesamte Ergebnismenge abzurufen und manuell zu iterieren?
Ich benutze MySQL 5.
Antworten:
Nächster:
Bisherige:
quelle
Zusätzlich zur Lösung von Cemkalyoncu :
nächste Aufzeichnung:
bisherigen Rekord:
Bearbeiten: Da diese Antwort in letzter Zeit einige positive Stimmen erhalten hat, möchte ich den Kommentar hervorheben, den ich zuvor zum Verständnis gemacht habe, dass eine Primärschlüsselspalte nicht als zu sortierende Spalte gedacht ist, da MySQL nicht garantiert, dass eine höhere automatische Inkrementierung erfolgt Werte werden notwendigerweise zu einem späteren Zeitpunkt hinzugefügt.
Wenn Sie sich nicht darum kümmern und einfach den Datensatz mit einem höheren (oder niedrigeren) Wert benötigen, reicht
id
dies aus. Verwenden Sie dies nur nicht, um festzustellen, ob ein Datensatz später (oder früher) tatsächlich hinzugefügt wird. Verwenden Sie stattdessen beispielsweise eine datetime-Spalte zum Sortieren.quelle
Alle oben genannten Lösungen erfordern zwei Datenbankaufrufe. Der folgende SQL-Code kombiniert zwei SQL-Anweisungen zu einer.
quelle
DISTINCT
vor*
, macht es noch besser, das heißt natürlich, wennid
es0
als Wert haben kann.id
eher Single als zwei zurückgegeben.quelle
SELECT * FROM foo WHERE id<4 ORDER BY id DESC LIMIT 1
für die vorherige AufzeichnungIch habe versucht, etwas Ähnliches zu tun, aber ich brauchte die nach Datum geordneten Ergebnisse, da ich mich nicht auf das ID-Feld als sortierbare Spalte verlassen kann. Hier ist die Lösung, die ich gefunden habe.
Zuerst ermitteln wir den Index des gewünschten Datensatzes in der Tabelle, wenn er nach unseren Wünschen sortiert ist:
Dann dekrementiere das Ergebnis um 2 und setze es in die limit-Anweisung. Zum Beispiel hat das oben Gesagte 21 für mich zurückgegeben, also renne ich:
Gibt Ihnen Ihren primären Datensatz zusammen mit den nächsten und vorherigen Datensätzen in Ihrer angegebenen Reihenfolge.
Ich habe versucht, dies als einzelnen Datenbankaufruf auszuführen, konnte jedoch die LIMIT-Anweisung nicht dazu bringen, eine Variable als einen ihrer Parameter zu verwenden.
quelle
Versuchen Sie dieses Beispiel.
Hinweis: Wenn der Wert nicht gefunden wird, wird null zurückgegeben .
Im obigen Beispiel ist der vorherige Wert Raja und der nächste Wert null, da es keinen nächsten Wert gibt.
quelle
Mit dem Ansatz von @Dan können Sie JOINs erstellen. Verwenden Sie einfach eine andere @ -Variable für jede Unterabfrage.
quelle
current
->current_row
&previous
->previous_row
.Nächste Reihe
Vorherige Zeile
Probe nächste Reihe
Beispiel vorherige Zeile
quelle
Ich hatte das gleiche Problem wie Dan, also habe ich seine Antwort verwendet und verbessert.
Wählen Sie zuerst den Zeilenindex aus, hier nichts anderes.
Verwenden Sie nun zwei separate Abfragen. Wenn der Zeilenindex beispielsweise 21 ist, lautet die Abfrage zur Auswahl des nächsten Datensatzes:
Verwenden Sie diese Abfrage, um den vorherigen Datensatz auszuwählen:
Beachten Sie, dass für die erste Zeile (Zeilenindex ist 1) das Limit auf -1 gesetzt wird und Sie einen MySQL-Fehler erhalten. Sie können eine if-Anweisung verwenden, um dies zu verhindern. Wählen Sie einfach nichts aus, da es sowieso keinen vorherigen Datensatz gibt. Im Fall des letzten Datensatzes wird es die nächste Zeile geben und daher wird es kein Ergebnis geben.
Beachten Sie auch, dass wenn Sie DESC anstelle von ASC zum Bestellen verwenden, die Abfragen zur Auswahl der nächsten und vorherigen Zeilen immer noch gleich sind, jedoch umgeschaltet werden.
quelle
Dies ist eine universelle Lösung für Bedingungen mit mehr gleichen Ergebnissen.
quelle
Hier haben wir eine Möglichkeit, vorherige und nächste Datensätze mit einer einzelnen MySQL-Abfrage abzurufen. Wobei 5 die ID des aktuellen Datensatzes ist.
quelle
Wie bekomme ich den nächsten / vorherigen Datensatz in MySQL & PHP?
Mein Beispiel ist, nur die ID zu erhalten
quelle
Optimieren des @ Don-Ansatzes, um nur eine Abfrage zu verwenden
Ändern Sie CurrentArticleID mit der aktuellen Artikel-ID wie
quelle
Es gibt einen weiteren Trick, mit dem Sie Spalten aus vorherigen Zeilen in beliebiger Reihenfolge mit einer Variablen anzeigen können, die dem @ row-Trick ähnelt:
Anscheinend werden die ausgewählten Spalten der Reihe nach ausgewertet, sodass zuerst die gespeicherten Variablen ausgewählt und dann die Variablen in der neuen Zeile aktualisiert werden (wobei sie dabei ausgewählt werden).
NB: Ich bin nicht sicher, ob dies ein definiertes Verhalten ist, aber ich habe es verwendet und es funktioniert.
quelle
Wenn Sie Ihrer Anfrage mehr als eine geben
id
möchten, erhalten Sienext_id
für alle ...Weisen Sie
cur_id
in Ihrem Auswahlfeld zu und geben Sie es dann an die Unterabfrage weiter, dienext_id
in das Auswahlfeld gelangt . Und dann wählen Sie einfachnext_id
.Verwenden der Longneck-Antwort zum Berechnen
next_id
:quelle
quelle
Wenn Sie eine Indexspalte haben, z. B. ID, können Sie die vorherige und die nächste ID in einer SQL-Anforderung zurückgeben. Ersetzen Sie: id durch Ihren Wert
quelle
Meine Lösung, um den nächsten und Vorschau-Datensatz zu erhalten, auch, um zum ersten Datensatz zurückzukehren, wenn ich bis zum letzten bin und umgekehrt
Ich benutze nicht die ID, ich benutze den Titel für nette URLs
Ich benutze Codeigniter HMVC
quelle
Hier ist meine Antwort. Ich greife eine Idee von ' Decent Dabbler ' auf und füge den Teil hinzu, der prüft, ob die ID zwischen min (id) und max (id) liegt. Hier ist der Teil zum Erstellen meiner Tabelle.
);
Der nächste Schritt ist das Erstellen einer gespeicherten Prozedur, die für das Abrufen der vorherigen ID verantwortlich ist.
Die erste Methode ist gut, wenn die Indizes sortiert sind, aber nicht. Zum Beispiel, wenn Sie Indizes haben: 1,2,7 und Sie müssen Index Nummer 2 auf diese Weise viel besser erhalten, um einen anderen Ansatz zu verwenden.
quelle
100% arbeiten
quelle
Ich denke, um die reale nächste oder vorherige Zeile in der SQL-Tabelle zu haben, benötigen wir den realen Wert mit gleich (<oder>), der mehr als eins zurückgibt, wenn Sie die Position der Zeile in einer Reihenfolgetabelle ändern müssen.
Wir brauchen den Wert
$position
, um dieneighbours
Zeile zu durchsuchen. In meiner Tabelle habe ich eine Spalte 'Position' erstellt.Die SQL-Abfrage zum Abrufen der erforderlichen Zeile lautet:
Fürs nächste :
für vorherige:
quelle
Wählen Sie Top 1 * aus foo, wobei ID> 4 nach ID aufsteigen
quelle
select * from foo where id>4 order by id asc LIMIT 1