Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Dejar solo los 50 registros mas nuevos

Estas en el tema de Dejar solo los 50 registros mas nuevos en el foro de Mysql en Foros del Web. Hola que tal, tengo una tabla: T1 | ID | Usuario | Fecha | Datos | y quiero dejar solo los ultimos 50 registros de ...
  #1 (permalink)  
Antiguo 06/02/2013, 11:56
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años
Puntos: 320
Pregunta Dejar solo los 50 registros mas nuevos

Hola que tal, tengo una tabla:

T1
| ID | Usuario | Fecha | Datos |

y quiero dejar solo los ultimos 50 registros de un usuario, (los 50 mas nuevos segun la fecha) eliminando los mas antiguos.

Como podria armar la consula?
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #2 (permalink)  
Antiguo 08/02/2013, 10:41
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años
Puntos: 320
Respuesta: Dejar solo los 50 registros mas nuevos

Arme esta consulta pero no me resulta :(
Código SQL:
Ver original
  1. DELETE FROM T1 AS TA WHERE TA.ID>(SELECT TB.ID AS IDA FROM T1 AS TB WHERE TB.Usuario=1 ORDER BY TB.Fecha DESC LIMIT 50,51);

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'As TA WHERE TA.ID>(SELECT TB.ID As IDA FROM T1 As TB WHERE TB.Usuario=1 ORDER BY TB.' at line 1

tambien probe:

Código MySQL:
Ver original
  1. DELETE FROM T1 WHERE Usuario=1 LIMIT 50,4294967295
y nada :/
le cambie de todo pero no anda, alguien me hecha un cable?
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Última edición por NSD; 08/02/2013 a las 10:54
  #3 (permalink)  
Antiguo 08/02/2013, 11:46
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Dejar solo los 50 registros mas nuevos

Hola NSD:

Para eliminar los registros de un usuario en específico podrías intentarlo así, supongamos que tenemos estos datos:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla ORDER BY usuario, fecha DESC;
  2. +------+---------+---------------------+---------------------+
  3. | id   | usuario | fecha               | valor               |
  4. +------+---------+---------------------+---------------------+
  5. |    9 | dos     | 2013-01-11 11:37:05 |  0.7715120667326376 |
  6. |    6 | dos     | 2012-08-28 11:37:05 |  0.3587129659566218 |
  7. |   10 | dos     | 2012-06-26 11:37:05 |  0.7995527096088535 |
  8. |    3 | dos     | 2012-05-17 11:37:05 |  0.2546243381263915 |
  9. |    5 | dos     | 2012-03-16 11:37:05 |  0.6319321306719744 |
  10. |   11 | tres    | 2012-12-23 11:37:05 | 0.24789315857728306 |
  11. |    7 | tres    | 2012-09-01 11:37:05 | 0.12815745373084905 |
  12. |   12 | tres    | 2012-04-04 11:37:05 |  0.5139959030915013 |
  13. |    4 | uno     | 2013-01-11 11:37:05 |  0.6275553103792996 |
  14. |    2 | uno     | 2012-10-17 11:37:05 | 0.13447859895832706 |
  15. |    8 | uno     | 2012-10-15 11:37:05 | 0.20657520387934075 |
  16. |    1 | uno     | 2012-04-21 11:37:05 | 0.14449659096495862 |
  17. +------+---------+---------------------+---------------------+
  18. 12 rows in set (0.00 sec)

Ahora bien, supongamos que queremos dejar sólo los últimos tres registros para cada usuario... podrías hacerlo así:

Código MySQL:
Ver original
  1. mysql> DELETE T1.* FROM tabla T1,
  2.     -> ( SELECT * FROM tabla
  3.     ->   WHERE usuario = 'uno'
  4.     ->   ORDER BY usuario, fecha DESC LIMIT 3, 999) T2
  5.     -> WHERE T1.id = T2.id;
  6. Query OK, 1 row affected (0.05 sec)
  7.  
  8. mysql> DELETE T1.* FROM tabla T1,
  9.     -> ( SELECT * FROM tabla
  10.     ->   WHERE usuario = 'dos'
  11.     ->   ORDER BY usuario, fecha DESC LIMIT 3, 999) T2
  12.     -> WHERE T1.id = T2.id;
  13. Query OK, 2 rows affected (0.04 sec)
  14.  
  15. mysql> SELECT * FROM tabla ORDER BY usuario, fecha DESC;
  16. +------+---------+---------------------+---------------------+
  17. | id   | usuario | fecha               | valor               |
  18. +------+---------+---------------------+---------------------+
  19. |    9 | dos     | 2013-01-11 11:37:05 |  0.7715120667326376 |
  20. |    6 | dos     | 2012-08-28 11:37:05 |  0.3587129659566218 |
  21. |   10 | dos     | 2012-06-26 11:37:05 |  0.7995527096088535 |
  22. |   11 | tres    | 2012-12-23 11:37:05 | 0.24789315857728306 |
  23. |    7 | tres    | 2012-09-01 11:37:05 | 0.12815745373084905 |
  24. |   12 | tres    | 2012-04-04 11:37:05 |  0.5139959030915013 |
  25. |    4 | uno     | 2013-01-11 11:37:05 |  0.6275553103792996 |
  26. |    2 | uno     | 2012-10-17 11:37:05 | 0.13447859895832706 |
  27. |    8 | uno     | 2012-10-15 11:37:05 | 0.20657520387934075 |
  28. +------+---------+---------------------+---------------------+
  29. 9 rows in set (0.00 sec)

observa que en realidad lo que hago es obtener mediante una subconsulta los registros que se tienen que eliminar...

Código:
SELECT * FROM tabla
WHERE usuario = 'uno'
ORDER BY usuario, fecha DESC LIMIT 3, 999
el LIMIT 3, 999 indica que deberá traer los registros, a partir del cuarto registro, hasta un número los suficientemente grande (999) para traer todos los registros de este usuario.

Si encuentro alguna otra forma más sencilla de hacerlo la posteo después... Por lo pronto puedes comenzar a probar esto.

Saludos
Leo.
  #4 (permalink)  
Antiguo 08/02/2013, 12:36
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años
Puntos: 320
Respuesta: Dejar solo los 50 registros mas nuevos

hola leo, tu consulta me anduvo genial el problema que le encuentro es que LIMIT 3, 999 elimina todos los registros desde el 3 al 999 pero que tal si hay 1200 registros? no se eliminarian dejando solo 3, no existe en mysql alguna constante equivalente a "INF" en php para indicar un infinito en el segundo parametro?
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #5 (permalink)  
Antiguo 08/02/2013, 13:39
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Dejar solo los 50 registros mas nuevos

Hola de nuevo NSD...

En mi post hago notar que este numero debe ser lo suficiente grande como para que abarque el total de registros que puede tener la tabla.... he hecho en la misma documentación oficial hacen notar este hecho:

http://dev.mysql.com/doc/refman/5.0/es/select.html

Cita:
Para recibir todos los registros de un desplazamiento hasta el final del conjunto de resultados, puede usar algún número grande para el segundo parámetro. Este comando recibe todos los registros desde el 96th hasta el último:

mysql> SELECT * FROM table LIMIT 95,18446744073709551615;
Saludos
Leo.

Etiquetas: dejar, nuevos, registros, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:47.