2012-01-16 81 views
8

Tengo un script que se ejecuta cada hora en mi sitio php. En ese script, me gustaría que algún tipo de consulta MySQL borre todos los registros de una tabla, pero diga los últimos 50.MySQL BORRAR todos menos los últimos registros X

¿Cómo haré algo así?

// pseudo code: like this? 
DELETE from chat WHERE id = max (ID - 50) 
+0

¿Puede agregar un campo de marca de tiempo a su tabla? –

+0

Si su columna de ID es una columna de identidad con autoincremento de 1, podría hacer algo como eso: 'ELIMINAR DE chat DONDE NO ESTÁ LA IDENTIFICACIÓN (SELECCIONAR IDENTIFICACIÓN DE TOP 50 DESDE chat ORDER BY ID DESC)' – pistipanko

+0

Tengo un campo datetime – user1022585

Respuesta

14

Usted podría tratar de usar NO EN:

EDITAR para MySQL:

DELETE FROM chat WHERE id NOT IN ( 
    SELECT id 
    FROM ( 
    SELECT id 
    FROM chat 
    ORDER BY id DESC 
    LIMIT 50 
) x 
); 

Esto es para SQL Server:

DELETE FROM chat WHERE id NOT IN 
    (SELECT TOP 50 id FROM chat ORDER BY id DESC) 

Suponiendo que los valores más altos de id son siempre más nuevos.

+0

Mejor ordenar los ID en la orden DESCending. –

+0

Intenté esto no funciona:/Tengo un campo 'date' también si eso ayuda – user1022585

+0

Whoops. Tu pregunta está etiquetada con SQL; prueba ahora con la solución MySQL. – Brissles

0

Usted podría intentar algo como esto:

DELETE from chat WHERE id < (SELECT max(ID)-50 FROM chat) 

Esto funcionaría si sus valores de ID se incrementa en pasos de 1. O puede usar algo como:

DELETE FROM chat WHERE id NOT IN 
    (SELECT id FROM (SELECT ID FROM chat ORDER BY datetime_col DESC LIMIT 50) t) -- mysql 
+0

no puede funcionar ninguno de estos: o – user1022585

+0

¿Qué sistema de base de datos usa? – Mithrandir

2
NO

en ES ineficiente. Puede modificar ligeramente la primera opción en la respuesta anterior con @Mithrandir para que se vea así:

DELETE from chat WHERE id < 
    (SELECT id FROM 
    (SELECT id FROM chat ORDER BY id DESC LIMIT 50) t ORDER BY id ASC LIMIT 1)); 
Cuestiones relacionadas