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:
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:
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.
@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)FROMtable;SELECT*FROMtableWHERE id =@last_id;
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.
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(*)-1ASrowcountFROM<yourTable>;
y luego use el número obtenido en la LIMITcláusula
auto_increment
ahí dentro. Me gustaría la más reciente.Respuestas:
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:fuente
id
está indexado.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:
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 conLIMIT 1
.fuente
Puede combinar dos consultas sugeridas por @spacepille en una sola consulta que se vea así:
Debería funcionar muy rápido, pero en las tablas INNODB es una fracción de milisegundo más lento que ORDER + LIMIT.
fuente
answered Jun 14 at 9:41
en tablas con muchas filas hay dos consultas probablemente más rápidas ...
fuente
Haz que simplemente use:
PDO::lastInsertId
http://php.net/manual/en/pdo.lastinsertid.php
fuente
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
.fuente
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,
O
Puede combinar dos consultas en una sola consulta que se vea así:
fuente
Esta consulta solía buscar el último registro en su tabla.
fuente
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 by
versusselect 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 optimizarorder by id + limit 1
para 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
y luego use el número obtenido en la
LIMIT
cláusulaDesafortunadamente, MySQL no permitirá una subconsulta o una variable de usuario en la
LIMIT
cláusulafuente
Puede usar un
OFFSET
en unLIMIT
comando:en caso de que su tabla tenga 100 filas, esto devuelve la última fila sin depender de una clave primaria
fuente