2010-05-05 13 views
18

ich muß einfach nur die zuletzt eingegebene Zeile angegeben von Zustand wählen, z:MySQL - Wählen Sie die letzte eingefügte Zeile einfachste Weg

SELECT ID from bugs WHERE user=Me 

ich vom User ‚Me‘ eingegeben nur die allerletzte ID zurückgeben müssen. Gibt es einen einfachen Weg, dies zu tun? Vielen Dank.

+0

Die beste Antwort fand ich ist die von Pomyk [hier] (http://stackoverflow.com/questions/1388025/how-to-get-id-of-the-last-updated -row-in-mysql # antwort-1751282) – aggregate1166877

Antwort

35

Es wäre am besten, eine TIMESTAMP Spalte zu haben, die standardmäßig CURRENT_TIMESTAMP ist .. es ist das einzige echte prädiktive Verhalten, das Sie hier finden können.

Die zweitbeste Sache, die Sie tun können, ist ORDER BY ID DESC LIMIT 1 und hoffe, dass die neueste ID der größte Wert ist.

27
SELECT MAX(ID) from bugs WHERE user=Me 
7

Im Nebenläufigkeit möglicherweise der neueste Datensatz nicht der Datensatz, den Sie gerade eingegeben haben. Es kann besser sein, den neuesten Datensatz mit dem Primärschlüssel zu erhalten.

Wenn es sich um ein Autoinkrementfeld handelt, verwenden Sie SELECT LAST_INSERT_ID();, um die gerade erstellte ID abzurufen.

+0

'LAST_INSERT_ID()' ist global. Es wird keine bedingungsbasierte ID zurückgegeben. – Matt

+6

Dieses ** nur ** funktioniert, wenn Sie nach der Zeile, die Sie abfragen möchten, das Einfügen nicht durchführen. Z. B., wenn sich jemand anmeldet ('in Benutzer einfügen ...'), dann erzeugt er einen Beitrag ('Einfügen in Beiträge ...'), 'last_insert_id()' bezieht sich auf die letzte 'posts.id'. Zu diesem Zeitpunkt gibt es keine Möglichkeit, den letzten Benutzer auszuwählen, der 'last_insert_id()' verwendet. –

+0

ok, ich verstehe die Frage falsch, danke. – Wayne

12

Eine Möglichkeit, dies zu erreichen, besteht darin, die Datensätze zu ordnen und auf 1 zu begrenzen. Zum Beispiel, wenn Sie die folgende Tabelle ('Daten') haben.

id | user | price 
    ------------------- 
    1 | me | 40.23 
    2 | me | 10.23 

Versuchen Sie, die folgende SQL-Abfrage

select * from data where user='me' order by id desc limit 1 
23

Sie ORDER BY ID DESC verwenden können, aber es ist viel schneller, wenn Sie diesen Weg gehen:

SELECT * FROM bugs WHERE user = 'me' AND ID = (SELECT MAX(ID) FROM bugs WHERE user = 'me') 

Wenn Sie selbst einen großen Tisch, es könnte einen signifikanten Unterschied machen.

EDIT

Sie auch eine Variable im Fall festlegen können Sie es brauchen mehr als einmal (oder wenn Sie denken, dass es einfacher ist, zu lesen).

SELECT @bug_id := MAX(ID) FROM bugs WHERE user = 'me'; 
SELECT * FROM bugs WHERE user = 'me' AND ID = @bug_id; 
+0

Ich habe es tatsächlich über einige Hunderte von Abfragen zeitlich gemessen. die 'ORDER BY 'TASTE' DESC LIMIT 1', kann 200+ Millisekunden (über 65%) schneller als die 'SELECT' von' SELECT' sein. dann wieder, meine DB ist super klein, die gesamte Abfrage dauert nicht mehr als 900 Millisekunden, also nahm ich an, dass Sortierung im größeren Maßstab langsamer sein könnte. aber MYSQL-Implementierungen wahrscheinlich optimieren häufig verwendeten Abfragen wie 'ORDER BY 'KEY' DESC LIMIT 1 ', so dass das Endergebnis viel (viel!) Weniger als tatsächlich sortieren dann das letzte Ergebnis zurückgeben wird. –

+7

Ok, vielleicht ist es mit einem kleinen Tisch schneller. Es ist gut zu wissen! Durch die Nachteile ist meine Lösung immer noch viel schneller für einen riesigen Tisch.Ich habe es mit einer Tabelle mit etwa 35.000 Zeilen getestet und es war 10 mal schneller als die Lösung mit ORDER. – pmrotule

3
SELECT * FROM `table_name` 
ORDER BY `table_name`.`column_name` DESC 
LIMIT 1 
Verwandte Themen