Wählen Sie die letzte Zeile in MySQL aus

182

Wie kann ich SELECTdie letzte Zeile in einer MySQL-Tabelle?

Ich habe INSERTDaten und muss einen Spaltenwert aus der vorherigen Zeile abrufen.

Da ist ein auto_incrementin der Tabelle.

esqew
quelle
7
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:

SELECT fields FROM table ORDER BY id DESC LIMIT 1;
Pekka
quelle
12
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:

SELECT    *
FROM      your_table
ORDER BY  your_auto_increment_field DESC
LIMIT     1;

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.

Daniel Vassallo
quelle
25

Sie können zwei von @spacepille vorgeschlagene Abfragen zu einer einzigen Abfrage kombinieren, die folgendermaßen aussieht:

SELECT * FROM `table_name` WHERE id=(SELECT MAX(id) FROM `table_name`);

Es sollte blitzschnell funktionieren, aber auf INNODB-Tabellen ist es ein Bruchteil einer Millisekunde langsamer als ORDER + LIMIT.

vzr
quelle
@ 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) FROM table;

SELECT * FROM table WHERE id = @last_id;
Raumpille
quelle
6

Machen Sie es einfach verwenden: PDO::lastInsertId

http://php.net/manual/en/pdo.lastinsertid.php

macio.Jun
quelle
2
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.

EboMike
quelle
4

Fast jede Datenbanktabelle enthält eine Spalte auto_increment (im Allgemeinen id).

Wenn Sie die letzte aller Zeilen in der Tabelle möchten,

SELECT columns FROM table ORDER BY id DESC LIMIT 1;

ODER

Sie können zwei Abfragen zu einer einzigen Abfrage kombinieren, die folgendermaßen aussieht:

SELECT columns FROM table WHERE id=(SELECT MAX(id) FROM table);
Sani Kamal
quelle
Auto-Inkrement ist nur da, wenn der DBA (oder wer auch immer die Tabelle erstellt hat) Auto-Inkremente implementiert hat
WhatsThePoint
2
SELECT * FROM adds where id=(select max(id) from adds);

Diese Abfrage wurde verwendet, um den letzten Datensatz in Ihrer Tabelle abzurufen.

karthikeyan
quelle
Kopie der Antwort unten
Jbur43
2

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(*) - 1 AS rowcount FROM <yourTable>;

und verwenden Sie dann die erhaltene Nummer in der LIMITKlausel

SELECT * FROM orderbook2
LIMIT <number_from_rowcount>, 1

Leider lässt MySQL keine Unterabfrage oder Benutzervariable in der LIMITKlausel zu

Ilia Gilmijarow
quelle
1

Sie können ein OFFSETin einem LIMITBefehl verwenden:

SELECT * FROM aTable LIMIT 1 OFFSET 99

Wenn Ihre Tabelle 100 Zeilen enthält, wird die letzte Zeile zurückgegeben, ohne auf einen Primärschlüssel angewiesen zu sein

Benvorth
quelle