Definieren Sie "letzte Zeile". Der mit der höchsten ID? Oder die zuletzt hinzugefügte?
EboMike
1
Was gibt die letzte Zeile an? Gibt es eine Spalte auto_increment oder DATETIME in der Tabelle?
OMG Ponys
Ja, da ist ein auto_incrementdrin. Ich möchte die zuletzt hinzugefügte.
Esqew
9
Es gibt keine letzte Reihe in einem Set, wie EboMike und OMG Ponies sagten. Was würdest du tun, wenn ich dir eine Tüte voller Bälle geben und dich bitten würde, mir den letzten Ball zu geben?
Vincent Savard
Antworten:
398
Ja, da ist ein auto_increment drin
Wenn Sie die letzte aller Zeilen in der Tabelle möchten , dann ist dies endlich die Zeit, in der MAX(id)die richtige Antwort ist! So'ne Art:
Ich befürchte, dass dies langsam wird, wenn Millionen von Zeilen sortiert werden müssen, nicht wahr?
Slawa
2
Ich bin gerade über 20m Reihen gelaufen und es war sehr schnell. Ich gehe davon aus, dass es einen Sonderfall für die Bearbeitung dieser Abfrage gibt. (EDIT: MySQL 5.7, InnoDB-Engine)
Daniel Buckmaster
1
@ Pekka: Ich möchte order by nicht verwenden. Gibt es eine andere Möglichkeit, dies zu tun?
Shiva
4
@Slawa Nicht wenn idindiziert ist.
Marquis von Lorne
31
Beachten Sie, dass Tabellen in relationalen Datenbanken nur Sätze von Zeilen sind. Und Mengen in der Mathematik sind ungeordnete Sammlungen. Es gibt keine erste oder letzte Zeile; Keine vorherige oder nächste Zeile.
Sie müssen zuerst Ihre ungeordneten Zeilen nach einem Feld sortieren, und dann können Sie die Ergebnismenge in der von Ihnen definierten Reihenfolge durchlaufen.
Da Sie ein automatisch inkrementierendes Feld haben, gehe ich davon aus, dass dies das Sortierfeld sein soll. In diesem Fall möchten Sie möglicherweise Folgendes tun:
Sehen Sie, wie wir zuerst die Menge der ungeordneten Zeilen nach your_auto_increment_field(oder wie auch immer Sie sie nennen) in absteigender Reihenfolge sortieren . Dann beschränken wir die Ergebnismenge auf nur die erste Zeile mit LIMIT 1.
@ karthikeyan schrieb seine Antwort vor vier Tagen und ich antwortete im Dezember 2015.
vzr
Nein, ich habe einige Schreibweisen vor 4 Tagen bearbeitet und korrigiert ... Post-Datum ist 2014, answered Jun 14 at 9:41das ist ungefähr 1 Jahr und 6 Monate früher :)
Dwza
Nur um hier die Luft zu reinigen, ist vzr richtig. Der '14. Juni 'bedeutet, dass der 14. Juni 2016 auch @karthikeyan zu diesem Zeitpunkt erst seit zwei Monaten Mitglied ist.
Robert Brisita
Ssooo ... @ karthikeyans Antwort ist eine Kopie davon!
Cliff Burton
24
Bei Tabellen mit vielen Zeilen sind zwei Abfragen wahrscheinlich schneller ...
SELECT@last_id := MAX(id)FROMtable;SELECT*FROMtableWHERE id =@last_id;
Richtig. Die meisten anständigen MySQL-Schnittstellenbibliotheken haben spezielle Methoden dafür, diese Frage wurde jedoch nicht mit PHP markiert, sondern mit der allgemeinen MySQL-Syntax.
vzr
4
Wenn Sie den zuletzt hinzugefügten möchten, fügen Sie einen Zeitstempel hinzu und wählen Sie in umgekehrter Reihenfolge nach dem höchsten Zeitstempel geordnet, Limit 1. Wenn Sie nach ID gehen möchten, sortieren Sie nach ID. Wenn Sie die gerade hinzugefügte verwenden möchten, verwenden Sie mysql_insert_id.
Viele Antworten hier sagen dasselbe (Reihenfolge nach Ihrem automatischen Inkrement), was in Ordnung ist, vorausgesetzt, Sie haben eine automatisch inkrementierte Spalte, die indiziert ist.
Auf einer Seite beachten, wenn Sie ein solches Feld haben , und es ist der Primärschlüssel, gibt es keine Performance - Einbußen für die Verwendung im order byVergleich select max(id). Der Primärschlüssel ist die Reihenfolge der Daten in den Datenbankdateien (zumindest für InnoDB). Das RDBMS weiß, wo diese Daten enden, und kann so optimiert werden order by id + limit 1, dass es mit dem Erreichen der Daten übereinstimmtmax(id)
Jetzt ist die Straße weniger befahren, wenn Sie keinen automatisch inkrementierten Primärschlüssel haben. Vielleicht ist der Primärschlüssel ein natürlicher Schlüssel, der aus 3 Feldern besteht ... Es ist jedoch nicht alles verloren. Aus einer Programmiersprache können Sie zunächst die Anzahl der Zeilen mit abrufen
SELECT Count(*)-1ASrowcountFROM<yourTable>;
und verwenden Sie dann die erhaltene Nummer in der LIMITKlausel
auto_increment
drin. Ich möchte die zuletzt hinzugefügte.Antworten:
Wenn Sie die letzte aller Zeilen in der Tabelle möchten , dann ist dies endlich die Zeit, in der
MAX(id)
die richtige Antwort ist! So'ne Art:quelle
id
indiziert ist.Beachten Sie, dass Tabellen in relationalen Datenbanken nur Sätze von Zeilen sind. Und Mengen in der Mathematik sind ungeordnete Sammlungen. Es gibt keine erste oder letzte Zeile; Keine vorherige oder nächste Zeile.
Sie müssen zuerst Ihre ungeordneten Zeilen nach einem Feld sortieren, und dann können Sie die Ergebnismenge in der von Ihnen definierten Reihenfolge durchlaufen.
Da Sie ein automatisch inkrementierendes Feld haben, gehe ich davon aus, dass dies das Sortierfeld sein soll. In diesem Fall möchten Sie möglicherweise Folgendes tun:
Sehen Sie, wie wir zuerst die Menge der ungeordneten Zeilen nach
your_auto_increment_field
(oder wie auch immer Sie sie nennen) in absteigender Reihenfolge sortieren . Dann beschränken wir die Ergebnismenge auf nur die erste Zeile mitLIMIT 1
.quelle
Sie können zwei von @spacepille vorgeschlagene Abfragen zu einer einzigen Abfrage kombinieren, die folgendermaßen aussieht:
Es sollte blitzschnell funktionieren, aber auf INNODB-Tabellen ist es ein Bruchteil einer Millisekunde langsamer als ORDER + LIMIT.
quelle
answered Jun 14 at 9:41
das ist ungefähr 1 Jahr und 6 Monate früher :)Bei Tabellen mit vielen Zeilen sind zwei Abfragen wahrscheinlich schneller ...
quelle
Machen Sie es einfach verwenden:
PDO::lastInsertId
http://php.net/manual/en/pdo.lastinsertid.php
quelle
Wenn Sie den zuletzt hinzugefügten möchten, fügen Sie einen Zeitstempel hinzu und wählen Sie in umgekehrter Reihenfolge nach dem höchsten Zeitstempel geordnet, Limit 1. Wenn Sie nach ID gehen möchten, sortieren Sie nach ID. Wenn Sie die gerade hinzugefügte verwenden möchten, verwenden Sie
mysql_insert_id
.quelle
Fast jede Datenbanktabelle enthält eine Spalte auto_increment (im Allgemeinen id).
Wenn Sie die letzte aller Zeilen in der Tabelle möchten,
ODER
Sie können zwei Abfragen zu einer einzigen Abfrage kombinieren, die folgendermaßen aussieht:
quelle
Diese Abfrage wurde verwendet, um den letzten Datensatz in Ihrer Tabelle abzurufen.
quelle
Viele Antworten hier sagen dasselbe (Reihenfolge nach Ihrem automatischen Inkrement), was in Ordnung ist, vorausgesetzt, Sie haben eine automatisch inkrementierte Spalte, die indiziert ist.
Auf einer Seite beachten, wenn Sie ein solches Feld haben , und es ist der Primärschlüssel, gibt es keine Performance - Einbußen für die Verwendung im
order by
Vergleichselect max(id)
. Der Primärschlüssel ist die Reihenfolge der Daten in den Datenbankdateien (zumindest für InnoDB). Das RDBMS weiß, wo diese Daten enden, und kann so optimiert werdenorder by id + limit 1
, dass es mit dem Erreichen der Daten übereinstimmtmax(id)
Jetzt ist die Straße weniger befahren, wenn Sie keinen automatisch inkrementierten Primärschlüssel haben. Vielleicht ist der Primärschlüssel ein natürlicher Schlüssel, der aus 3 Feldern besteht ... Es ist jedoch nicht alles verloren. Aus einer Programmiersprache können Sie zunächst die Anzahl der Zeilen mit abrufen
und verwenden Sie dann die erhaltene Nummer in der
LIMIT
KlauselLeider lässt MySQL keine Unterabfrage oder Benutzervariable in der
LIMIT
Klausel zuquelle
Sie können ein
OFFSET
in einemLIMIT
Befehl verwenden:Wenn Ihre Tabelle 100 Zeilen enthält, wird die letzte Zeile zurückgegeben, ohne auf einen Primärschlüssel angewiesen zu sein
quelle