Tengo una tabla llamada ‘archivos’ en mi bd (uso MySQL), en la cual tengo los siguientes campos: id, nombre, created, uploaded, deleted. El campo ‘nombre’ tiene este formato:
(fecha)-(remitente)-(destinatario)-(nombre_del_archivo)
No debe haber dos archivos o más con el mismo nombre, en tal caso, se deben marcar como ‘eliminados’ los archivos mas antiguos colocando el valor ‘deleted = “(fecha_de_hoy)”‘, y el más reciente debe tener ‘deleted = “0000-00-00 00:00:00″‘, ejemplo:
id| nombre | created | uploaded | deleted
1 |20210221-juan-maria-te_quiero.jpg|2020-02-21 18:15|2020-02-21 18:16|0000-00-00 00:00:00
2 |20210221-juan-maria-te_quiero.jpg|2021-01-01 12:08|2021-01-01 12:09|0000-00-00 00:00:00
3 |20210221-maria-juan-te_quiero.jpg|2020-02-21 19:15|2020-02-21 19:16|0000-00-00 00:00:00
4 |20210221-maria-juan-te_quiero.jpg|2021-01-01 13:08|2021-01-01 13:09|0000-00-00 00:00:00
debe sustituirse por:
id| nombre | created | uploaded | deleted
1 |20210221-juan-maria-te_quiero.jpg|2020-02-21 18:15|2020-02-21 18:16|2021-02-21 21:21:00
2 |20210221-juan-maria-te_quiero.jpg|2021-01-01 12:08|2021-01-01 12:09|0000-00-00 00:00:00
3 |20210221-maria-juan-te_quiero.jpg|2020-02-21 19:15|2020-02-21 19:16|2021-02-21 21:21:00
4 |20210221-maria-juan-te_quiero.jpg|2021-01-01 13:08|2021-01-01 13:09|0000-00-00 00:00:00
La tabla tiene alrededor de 400.000 registros, existen muchos conjuntos de nombres repetidos en donde se tiene que aplicar la regla del ejemplo de arriba.
Hasta ahora se me han ocurrido 2 soluciones:
-
Crear 2 archivos PHP, en uno traer todos los registros y almacenarlos en un archivo de texto, y en otro leer ese archivo de texto y almacenar los datos en un array para posteriormente marcar los duplicados como eliminados, luego guardar el resultado en un archivo de texto y por último vaciar la tabla e importar los datos que están en el nuevo archivo de texto.
-
Con subconsultas, en primera instancia construí un SELECT para traer aquellos registros que se van a eliminar (los más antiguos) y constatar que todo está bien para posteriormente proseguir con un UPDATE en lugar del SELECT, hasta ahora esto es lo que llevo (no sé si está bien):
SELECT id, nombre, created, uploaded, deleted FROM archivos a WHERE deleted = '0000-00-00 00:00:00' AND uploaded <> (SELECT MAX(uploaded) FROM archivos b WHERE b.name = a.name)
La cuestión es, que al tener una cantidad tan grande de datos, estoy ante dos problemas:
-
Desbordamiento de la memoria (me sucede con PHP).
-
La subconsulta es eterna, nunca veo el resultado (usando phpmyadmin).