2010-05-05 17 views
18

Simplemente necesito para seleccionar la última fila entrado especificado por condición, por ejemplo:MySQL - Seleccione la última fila insertada manera más fácil

SELECT ID from bugs WHERE user=Me 

necesito devolver sólo el último ID introducida por el usuario 'Me'. ¿Hay una manera simple de hacer esto? Gracias.

+0

La mejor respuesta que he encontrado es el de Pomyk [aquí] (http://stackoverflow.com/questions/1388025/how-to-get-id-of-the-last-updated -row-in-mysql # answer-1751282) – aggregate1166877

Respuesta

35

Lo mejor sería tener una columna TIMESTAMP que por defecto es CURRENT_TIMESTAMP .. es el único comportamiento predictivo verdadero que puede encontrar aquí.

La segunda mejor cosa que puede hacer es ORDER BY ID DESC LIMIT 1 y esperamos que la nueva identificación sea del mayor valor.

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

En concurrencia, el registro más reciente puede no ser el que acaba de ingresar. Puede ser mejor obtener el último registro con la clave principal.

Si se trata de un campo de incremento automático, use SELECT LAST_INSERT_ID(); para obtener el ID que acaba de crear.

+0

'LAST_INSERT_ID()' es global. No devolverá una ID basada en la condición. – Matt

+6

Este ** solo ** funciona si no realiza la inserción después de la fila que está tratando de consultar. Por ejemplo, si alguien se registra ('insertar en usuarios ...'), entonces crea una publicación ('insert into posts ...'), 'last_insert_id()' se referirá a la última 'posts.id'. En este punto, no hay forma de seleccionar el último usuario usando 'last_insert_id()'. –

+0

bien, no entiendo la pregunta, gracias. – Wayne

12

Una forma de lograr eso es ordenar sus registros y limitarlos a 1. Por ejemplo, si tiene la siguiente tabla ('datos').

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

intente lo siguiente consulta SQL

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

Puede utilizar ORDER BY ID DESC, pero es mucho más rápido si vas de esa manera:

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

En caso de que usted tiene una gran mesa, podría hacer una diferencia significativa.

EDITAR

Incluso puede configurar una variable en caso de que lo necesite más de una vez (o si usted piensa que es más fácil de leer).

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

En realidad, he cronometrado cientos de consultas. el 'ORDER BY 'KEY' DESC LIMIT 1', puede ser 200+ milisegundos (más del 65%) más rápido que el' SELECT' de 'SELECT'. una vez más, mi base de datos es muy pequeña, toda la consulta no toma más de 900 milisegundos, por lo que supongo que en una clasificación a mayor escala podría ser más lento. pero, de nuevo, las implementaciones MYSQL probablemente optimizan las consultas comúnmente utilizadas, como 'ORDER BY 'KEY' DESC LIMIT 1', por lo que el resultado final tomará mucho (¡mucho!) Menos que clasificar y luego devolver el último resultado. –

+7

Ok, entonces quizás sea más rápido con una mesa pequeña. ¡Es bueno saberlo! Por contra, mi solución es aún mucho más rápida para una gran mesa.Lo probé con una tabla con alrededor de 35,000 filas y fue 10 veces más rápido que la solución con ORDEN. – pmrotule

3
SELECT * FROM `table_name` 
ORDER BY `table_name`.`column_name` DESC 
LIMIT 1 
Cuestiones relacionadas