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.

esqew
fuente
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;
Pekka
fuente
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.

Daniel Vassallo
fuente
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.

vzr
fuente
@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;
Spacepille
fuente
6

Haz que simplemente use: PDO::lastInsertId

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

macio.Jun
fuente
2
Correcto. La mayoría de las bibliotecas de interfaz MySQL decentes tienen métodos dedicados para esto, sin embargo, esta pregunta no fue etiquetada como PHP sino sintaxis general de MySQL.
vzr
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.

EboMike
fuente
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);
Sani Kamal
fuente
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.

karthikeyan
fuente
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

Ilia Gilmijarow
fuente
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

Benvorth
fuente