Seleziona l'ultima riga in MySQL


181

Come posso SELECTl'ultima riga in una tabella MySQL?

Sto utilizzando INSERTi dati e devo recuperare un valore di colonna dalla riga precedente.

C'è un auto_incrementnel tavolo.


8
Definire "ultima riga". Quello con l'ID più alto? O l'ultimo aggiunto?
EboMike

1
Cosa indica l'ultima riga: esiste una colonna auto_increment o DATETIME nella tabella?
OMG Pony

Sì, c'è un auto_incrementdentro. Vorrei l'ultimo aggiunto.
esqew,

9
Non c'è l'ultima fila in un set, come hanno detto EboMike e OMG Ponies. Cosa faresti se ti regalassi una borsa piena di palline e ti chiedessi di darmi l'ultima palla?
Vincent Savard,

Risposte:


402

Sì, c'è un auto_increment in là

Se vuoi l'ultima di tutte le righe nella tabella, allora questo è finalmente il momento in cui MAX(id)è la risposta giusta! Tipo:

SELECT fields FROM table ORDER BY id DESC LIMIT 1;

12
Temo che questo rallenti se deve ordinare milioni di righe, non è vero?
Slawa,

2
Ho appena corso oltre 20m di file ed è stato molto veloce. Suppongo che ci sia una specie di caso speciale per gestire questa query. (EDIT: MySQL 5.7, motore InnoDB)
Daniel Buckmaster,

1
@Pekka: non voglio usare order by, c'è qualche altra opzione per farlo?
shiva,

4
@Slawa Non se idè indicizzato.
Marchese di Lorne,

31

Tenere presente che le tabelle nei database relazionali sono solo insiemi di righe. E i set in matematica sono raccolte non ordinate. Non esiste la prima o l'ultima riga; nessuna riga precedente o riga successiva.

Dovrai prima ordinare il tuo set di righe non ordinate in base a qualche campo, quindi sarai libero dall'iterazione attraverso il set di risultati nell'ordine che hai definito.

Dato che hai un campo con incremento automatico, suppongo che tu voglia che sia il campo di ordinamento. In tal caso, potresti voler fare quanto segue:

SELECT    *
FROM      your_table
ORDER BY  your_auto_increment_field DESC
LIMIT     1;

Guarda come stiamo prima ordinando l'insieme di righe non ordinate per your_auto_increment_field(o come lo hai chiamato) in ordine decrescente. Quindi limitiamo il gruppo di risultati solo alla prima riga con LIMIT 1.


25

È possibile combinare due query suggerite da @spacepille in una singola query simile alla seguente:

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

Dovrebbe funzionare velocissimo, ma sui tavoli INNODB è una frazione di millisecondo più lenta di ORDER + LIMIT.


@karthikeyan ha scritto la sua risposta quattro giorni fa e ho risposto a questa domanda nel dicembre 2015.
vzr

no, ho modificato e corretto alcuni errori ortografici 4 giorni fa ... la data di pubblicazione è 2014 answered Jun 14 at 9:41circa 1 anno e 6 mesi prima :)
Dwza,

Solo per liberare l'aria qui vzr ha ragione. Il "14 giugno" significa che il 14 giugno 2016 anche @karthikeyan è membro da due mesi solo a questo punto.
Robert Brisita,

Ssooo ... La risposta di @ karthikeyan è una copia di questa!
Cliff Burton,

24

sulle tabelle con molte righe sono due query probabilmente più veloci ...

SELECT @last_id := MAX(id) FROM table;

SELECT * FROM table WHERE id = @last_id;


4

Se si desidera aggiungere quello più recente, aggiungere un timestamp e selezionare in ordine inverso in base al timestamp più alto, limite 1. Se si desidera passare per ID, ordinare per ID. Se vuoi usare quello che hai appena aggiunto, usa mysql_insert_id.


4

Quasi ogni tabella di database, c'è una colonna auto_increment (generalmente id)

Se vuoi l'ultima di tutte le righe nella tabella,

SELECT columns FROM table ORDER BY id DESC LIMIT 1;

O

È possibile combinare due query in un'unica query simile alla seguente:

SELECT columns FROM table WHERE id=(SELECT MAX(id) FROM table);

l'incremento automatico è presente solo se il DBA (o chiunque abbia creato la tabella) ha implementato gli incrementi automatici
WhatsThePoint,

2
SELECT * FROM adds where id=(select max(id) from adds);

Questa query è stata utilizzata per recuperare l'ultimo record nella tabella.


Copia della risposta di seguito
Jbur43

2

Molte risposte qui dicono lo stesso (ordine in base all'incremento automatico), che è OK, a condizione che tu abbia una colonna autoincrementata che è indicizzata.

In una nota a margine, se si dispone di tale campo ed è la chiave primaria, non vi è alcuna penalità di prestazione per l'utilizzo order bycontro select max(id). La chiave primaria è il modo in cui i dati vengono ordinati nei file del database (almeno per InnoDB) e RDBMS sa dove finiscono quei dati e può ottimizzare order by id + limit 1per essere uguale a raggiungere ilmax(id)

Ora la strada meno percorsa è quando non si dispone di una chiave primaria autoincrementata. Forse la chiave primaria è una chiave naturale, che è un composto di 3 campi ... Tuttavia, non tutto è perduto. Da un linguaggio di programmazione puoi prima ottenere il numero di righe con

SELECT Count(*) - 1 AS rowcount FROM <yourTable>;

e quindi utilizzare il numero ottenuto nella LIMITclausola

SELECT * FROM orderbook2
LIMIT <number_from_rowcount>, 1

Sfortunatamente, MySQL non consentirà una sottoquery o una variabile utente nella LIMITclausola


1

Puoi usare un OFFSETin un LIMITcomando:

SELECT * FROM aTable LIMIT 1 OFFSET 99

nel caso in cui la tua tabella abbia 100 righe, questo restituisce l'ultima riga senza fare affidamento su una chiave_primo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.