2010-10-13 13 views
8

en primer lugar, esta es la consulta que crea el "historial del jugador" que se puede ejecutar tantas veces como desee y solo creará nuevo historial filas para los jugadores si no hay una fila de historial para ayer o si los valores han cambiado desde la última entrada de historial en el pasado.MySQL Specialists: elimine todas las filas anteriores a x días pero no la última

INSERT INTO `player_history` (`player_id`, `date`, `races`, `maps`, `playtime`, `points`) 
SELECT `p`.`id`, DATE_SUB(NOW(), INTERVAL 1 DAY), `p`.`races`, `p`.`maps`, `p`.`playtime`, `p`.`points` 
FROM `player` `p` 
WHERE `p`.`playtime` IS NOT NULL 
AND `p`.`playtime` > 0 
AND (
    SELECT `player_id` 
    FROM `player_history`^ 
    WHERE `player_id` = `p`.`id` 
    AND (
     `date` = DATE_SUB(NOW(), INTERVAL 1 DAY) 
     OR (
      `date` < DATE_SUB(NOW(), INTERVAL 1 DAY) 
      AND `races` = `p`.`races` 
      AND `points` = `p`.`points` 
      AND `maps` = `p`.`maps` 
      AND `playtime` = `p`.`playtime` 
     ) 
    ) 
    ORDER BY `date` DESC 
    LIMIT 1 
) IS NULL; 

ahora el problema es que también quiero limpiar la tabla de historial con una sola consulta. esto ya selecciona todas las entradas de historial anteriores a 10 días pero la última. pero no puedo hacer DELETE en lugar de SELECT *.

SELECT * 
FROM `player_history` `ph` 
WHERE `date` < DATE_SUB(NOW(), INTERVAL 10 DAY) 
AND `date` != (SELECT `date` 
    FROM `player_history` 
    WHERE `player_id` = `ph`.`player_id` 
    ORDER BY `date` DESC 
    LIMIT 1); 

así que ¿tehre una forma de hacer lo que quiero con una sola consulta de eliminación?

Respuesta

9

Su consulta me parece correcta, pero no tiene el intervalo en la subconsulta.

Me gustaría hacer esto:

DELETE FROM player_history 
WHERE date < DATE_SUB(NOW(), INTERVAL 10 DAY) 
AND date != (
    SELECT MAX(date) FROM player_history 
    WHERE date < DATE_SUB(NOW(), INTERVAL 10 DAY) 
) 

Cuál es el mensaje de error de MySQL?

1

Probablemente no se puede hacer esto en una sola consulta debido a que los estados documentation:

Actualmente, no se puede borrar de una tabla y seleccionar de la misma tabla en una subconsulta.

Como solución alternativa, puede seleccionar los identificadores de las filas que deben eliminarse en una tabla temporal y luego usar una declaración de eliminación de varias tablas para eliminar los registros de la tabla original.

Cuestiones relacionadas