2010-05-05 14 views
18

Ho semplicemente bisogno di selezionare l'ultima riga immesso specificato da condizioni, per esempio:MySQL - Selezionare l'ultima riga inserita modo più semplice

SELECT ID from bugs WHERE user=Me 

ho bisogno di restituire solo all'ultimo ID immesso dall'utente 'Me'. C'è un modo semplice per fare questo? Grazie.

+0

La migliore risposta che ho trovato è quella di Pomyk [qui] (http://stackoverflow.com/questions/1388025/how-to-get-id-of-the-last-updated -row-in-mysql # answer-1751282) – aggregate1166877

risposta

35

Sarebbe meglio disporre di una colonna TIMESTAMP che per impostazione predefinita sia CURRENT_TIMESTAMP .. è l'unico vero comportamento predittivo che è possibile trovare qui.

La seconda cosa migliore che puoi fare è ORDER BY ID DESC LIMIT 1 e spero che il nuovo ID sia il più grande valore.

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

In concomitanza, l'ultimo record potrebbe non essere il record appena inserito. Potrebbe essere meglio ottenere l'ultimo record usando la chiave primaria.

Se è un campo di incremento automatico, utilizzare SELECT LAST_INSERT_ID(); per ottenere l'ID appena creato.

+0

'LAST_INSERT_ID()' è globale. Non restituirà un ID basato sulle condizioni. – Matt

+6

Questo ** solo ** funziona se non si esegue l'inserimento dopo la riga che si sta tentando di eseguire una query. Ad esempio, se qualcuno si registra ('inserisci negli utenti ...') quindi crea un post ('inserisci nei post ...'), 'last_insert_id()' farà riferimento all'ultimo 'posts.id'. A questo punto, non c'è modo di selezionare l'ultimo utente usando 'last_insert_id()'. –

+0

ok, ho frainteso la domanda, grazie. – Wayne

12

Un modo per ottenere ciò è ordinare i record e limitare a 1. Ad esempio se si dispone della seguente tabella ("dati").

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

Prova la seguente query SQL

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

È possibile utilizzare ORDER BY ID DESC, ma è il modo più veloce se si va in questo modo:

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

Nel caso in cui si dispone di un enorme tavolo, potrebbe fare una differenza significativa.

EDIT

È anche possibile impostare una variabile in caso di necessità più di una volta (o se si pensa che è più facile da leggere).

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

L'ho effettivamente programmato su alcune centinaia di query. il "LIMITE DI DESCRIZIONE 1" di ORDER BY, può essere più veloce di 200+ millisecondi (oltre il 65%) di "SELECT" di "SELECT". Quindi, ancora una volta, il mio DB è super piccolo, l'intera query non richiede più di 900 millisecondi, quindi supponevo che l'ordinamento su più grande scala fosse più lento. ma, di nuovo, le implementazioni di MYSQL probabilmente ottimizzano le query di uso comune come 'ORDER BY 'KEY' DESC LIMIT 1', quindi il risultato finale richiederà molto (molto!) Meno dell'effettivo ordinamento, quindi restituirà l'ultimo risultato. –

+7

Ok, quindi forse è più veloce con un tavolino. Buono a sapersi! Con contro, la mia soluzione è ancora molto più veloce per un tavolo enorme.L'ho provato con un tavolo con circa 35.000 file ed era 10 volte più veloce della soluzione con ORDER. – pmrotule

3
SELECT * FROM `table_name` 
ORDER BY `table_name`.`column_name` DESC 
LIMIT 1 
Problemi correlati