Seleccione la última fila en MySQL


181

¿Cómo puedo SELECTla última fila en una tabla MySQL?

Estoy INSERTingresando datos y necesito recuperar un valor de columna de la fila anterior.

Hay un auto_incrementen la mesa.


8
Definir "última fila". ¿El que tiene la identificación más alta? ¿O el más reciente agregado?
EboMike

1
¿Qué indica la última fila? ¿Hay una columna auto_increment o DATETIME en la tabla?
OMG Ponis

Sí, hay una auto_incrementahí dentro. Me gustaría la más reciente.
esqew el

9
No hay una última fila en un conjunto, como dijeron EboMike y OMG Ponies. ¿Qué harías si te doy una bolsa llena de bolas y te pido que me des la última bola?
Vincent Savard el

Respuestas:


402

Sí, hay un auto_increment allí

Si desea la última de todas las filas de la tabla, ¡este es finalmente el momento en que MAX(id)es la respuesta correcta! Mas o menos:

SELECT fields FROM table ORDER BY id DESC LIMIT 1;

12
Me temo que esto se ralentiza si necesita ordenar millones de filas, ¿no?
Slawa

2
Acabo de ejecutar esto en más de 20m de filas y fue muy rápido. Supongo que hay algún tipo de caso especial para manejar esta consulta. (EDITAR: MySQL 5.7, motor InnoDB)
Daniel Buckmaster

1
@Pekka: No quiero usar el orden, ¿hay alguna otra opción para hacerlo?
shiva

44
@Slawa No si idestá indexado.
Marqués de Lorne

31

Tenga en cuenta que las tablas en las bases de datos relacionales son solo conjuntos de filas. Y los conjuntos de matemáticas son colecciones desordenadas. No hay primera o última fila; sin fila anterior o siguiente fila.

Primero tendrá que ordenar su conjunto de filas desordenadas por algún campo, y luego podrá liberar la iteración a través del conjunto de resultados en el orden que definió.

Como tiene un campo de incremento automático, supongo que desea que ese sea el campo de clasificación. En ese caso, es posible que desee hacer lo siguiente:

SELECT    *
FROM      your_table
ORDER BY  your_auto_increment_field DESC
LIMIT     1;

Vea cómo primero estamos ordenando el conjunto de filas desordenadas por your_auto_increment_field(o como se llame) en orden descendente. Luego limitamos el conjunto de resultados a solo la primera fila con LIMIT 1.


25

Puede combinar dos consultas sugeridas por @spacepille en una sola consulta que se vea así:

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

Debería funcionar muy rápido, pero en las tablas INNODB es una fracción de milisegundo más lento que ORDER + LIMIT.


@karthikeyan escribió su respuesta hace cuatro días y respondí esto en diciembre de 2015.
vzr

no, yo answered Jun 14 at 9:41
edité

Solo para aclarar el aire aquí vzr es correcto. El '14 de junio' significa que el 14 de junio de 2016 también @karthikeyan solo ha sido miembro durante dos meses en este momento.
Robert Brisita

Ssooo ... ¡La respuesta de @karthikeyan es una copia de esta!
Cliff Burton el

24

en tablas con muchas filas hay dos consultas probablemente más rápidas ...

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

SELECT * FROM table WHERE id = @last_id;


4

Si desea agregar el más reciente, agregue una marca de tiempo y seleccione ordenado en orden inverso por la marca de tiempo más alta, límite 1. Si desea ir por ID, ordene por ID. Si desea usar el que acaba de agregar, use mysql_insert_id.


4

Casi todas las tablas de la base de datos, hay una columna auto_increment (generalmente id)

Si desea la última de todas las filas de la tabla,

SELECT columns FROM table ORDER BY id DESC LIMIT 1;

O

Puede combinar dos consultas en una sola consulta que se vea así:

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

el incremento automático solo está ahí si el DBA (o quien hizo la tabla) implementó incrementos automáticos
WhatsThePoint

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

Esta consulta solía buscar el último registro en su tabla.


Copia de la respuesta a continuación
Jbur43

2

Muchas respuestas aquí dicen lo mismo (ordenar por su incremento automático), lo cual está bien, siempre que tenga una columna autoincrementada que esté indexada.

En una nota al margen, si tiene ese campo y es la clave principal, no hay penalización de rendimiento por usar order byversus select max(id). La clave principal es cómo se ordenan los datos en los archivos de la base de datos (al menos para InnoDB), y el RDBMS sabe dónde terminan esos datos, y puede optimizar order by id + limit 1para que sean los mismos que alcanzarmax(id)

Ahora el camino menos transitado es cuando no tiene una clave primaria autoincrementada. Quizás la clave primaria es una clave natural, que es un compuesto de 3 campos ... Sin embargo, no todo está perdido. Desde un lenguaje de programación, primero puede obtener el número de filas con

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

y luego use el número obtenido en la LIMITcláusula

SELECT * FROM orderbook2
LIMIT <number_from_rowcount>, 1

Desafortunadamente, MySQL no permitirá una subconsulta o una variable de usuario en la LIMITcláusula


1

Puede usar un OFFSETen un LIMITcomando:

SELECT * FROM aTable LIMIT 1 OFFSET 99

en caso de que su tabla tenga 100 filas, esto devuelve la última fila sin depender de una clave primaria

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.