2009-02-21 27 views
61

Tengo una tabla con índice (autoincrement) y valor entero. La tabla tiene millones de filas de largo.mysql seleccionar desde n últimas filas

¿Cómo puedo buscar si un determinado número aparece de la manera más eficiente en las últimas n filas de la tabla?

Respuesta

87

A partir de la answer dada por @chaos, pero con algunas modificaciones:

  • Siempre debe usar ORDER BY si usa LIMIT. No hay un orden implícito garantizado para una tabla RDBMS. Puede generalmente obtener filas en el orden de la clave principal, pero no puede confiar en esto, ni es portátil.

  • Si realiza su pedido en orden descendente, no necesita saber el número de filas en la tabla de antemano.

  • Debe dar un nombre de correlación (alias de tabla) a una tabla derivada.

aquí está mi versión de la consulta:

SELECT `id` 
FROM (
    SELECT `id`, `val` 
    FROM `big_table` 
    ORDER BY `id` DESC 
    LIMIT $n 
) AS t 
WHERE t.`val` = $certain_number; 
+1

Rechazaría esto varias veces si pudiera, todas las demás respuestas tienen errores. Esto es lo que habría publicado también. –

+3

Tenga en cuenta que la respuesta de @chaos a la que me refiero se ha eliminado. –

+0

¡Gracias! ¿Cuántos registros tendrá que escanear el motor para obtener la respuesta? ¿Es n? o m = la ubicación de val desde la parte superior? – Nir

12

Aproveche SORT y LIMIT como lo haría con la paginación. Si quiere el i-ésimo bloque de filas, use OFFSET.

SELECT val FROM big_table 
where val = someval 
ORDER BY id DESC 
LIMIT n; 

En respuesta a Nir: La operación de ordenación no necesariamente está penalizado, esto depende de lo que el planificador de consulta. Dado que este caso de uso es crucial para el rendimiento de la paginación, hay algunas optimizaciones (ver enlace arriba). Esto es cierto en postgres así "ORDER BY ... límite puede hacerse sin clasificar" E.7.1. Last bullet

explain extended select id from items where val = 48 order by id desc limit 10; 
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+ 
| id | select_type | table | type | possible_keys | key  | key_len | ref | rows | Extra  | 
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+ 
| 1 | SIMPLE  | items | const | PRIMARY  | PRIMARY | 4  | const | 1 | Using index | 
+----+-------------+-------+-------+---------------+---------+---------+-------+------+-------------+ 
+0

No puede utilizar MAX() o COUNT() en una cláusula WHERE. –

+0

Se reemplazó el código incorrecto con una instrucción CASE. –

+0

La caja no elimina NULL así que eliminé ese ejemplo por completo. –

3

porque es incrementado automáticamente, aquí está mi tomar:

Select * from tbl 
where certainconditionshere 
and autoincfield >= (select max(autoincfield) from tbl) - $n 
+0

Simplemente cambiaría el orden de las condiciones en la cláusula WHERE. –

+4

Esta respuesta supone que las últimas $ n filas tienen valores de identificación contiguos. –

12

Últimos 5 filas recuperar en MySQL

Este trabajo consulta perfectamente

SELECT * FROM (SELECT * FROM recharge ORDER BY sno DESC LIMIT 5)sub ORDER BY sno ASC 

o

select sno from(select sno from recharge order by sno desc limit 5) as t where t.sno order by t.sno asc 
+0

La consulta principal funciona perfectamente en MySQL. ¡Gracias! – L0j1k

0

Sé que esto puede ser un poco viejo, pero trate de usar PDO::lastInsertId. Creo que hace lo que quiere, pero tendría que volver a escribir su aplicación para usar PDO (que es mucho más seguro contra los ataques)

14

Podría ser una respuesta muy tardía, pero esto es bueno y simple.

select * from table_name order by id desc limit 5 

Esta consulta devolverá un conjunto de valores (últimos 5 últimos 5 filas) usted ha insertado en la tabla

+3

¿Qué valor proporciona esto? La pregunta fue respondida hace seis años. El fragmento de código parece ser un subconjunto de respuestas proporcionadas previamente, y no tiene explicación. – jww

+1

@jww para el OP, esta es la respuesta correcta –

+0

genial, simple y al grano! +1 – gumuruh

Cuestiones relacionadas