Ver Mensaje Individual
  #9 (permalink)  
Antiguo 12/02/2014, 14:56
videlxu
 
Fecha de Ingreso: diciembre-2013
Mensajes: 108
Antigüedad: 10 años, 4 meses
Puntos: 1
Respuesta: Delete en una consulta

Cita:
Iniciado por videlxu Ver Mensaje
Hola Tengo un problema , tengo esta consulta
Código MySQL:
Ver original
  1. SELECT * , COUNT( * ) AS Repetido
  2. FROM alumno AS Tmp
  3. GROUP BY cod_alu, ape_pat, ape_mat
  4. HAVING COUNT( * ) >1
me funciona a la perfeccion pero ahora como hago para borrar todos los registros que esa consulta me bota?? , muchas gracias de ante mano.
Cita:
Iniciado por leonardo_josue Ver Mensaje
Hola videlxu:

Lo que pretendes hacer en realidad es algo peligroso, una cosa es eliminar registros duplicados y otra cosas es eliminar TODO el contenido duplicado... ¿a qué me refiero con esto?, observa el siguiente ejemplo:

Código:
mysql> SELECT * FROM tabla;
+------+-------------+
| id   | descripcion |
+------+-------------+
|    1 | uno         |
|    2 | dos         |
|    3 | tres        |
|    1 | uno         |
|    5 | uno         |
|    1 | seis        |
|    2 | siete       |
|    2 | dos         |
+------+-------------+
8 rows in set (0.00 sec)
observa que en la tabla existen varios registros que se repiten, tanto en su id, como en su descripcion,

+------+-------------+
| id | descripcion |
+------+-------------+
| 1 | uno |
| 2 | dos |
| 1 | uno |
| 2 | dos |
+------+-------------+

y además hay descripciones que se repiten, pero que tienen un id distinto:

+------+-------------+
| id | descripcion |
+------+-------------+
| 1 | uno |
| 1 | uno |
| 5 | uno |
+------+-------------+

Tal como planteas tu consulta, te interesaría eliminar todos los nombres repetidos (independientemente de si tienen más campos distintos). partiendo de la consulta inicial algo como esto:

Código MySQL:
Ver original
  1. mysql> SELECT descripcion, COUNT(*) total FROM tabla
  2.     -> GROUP BY descripcion
  3.     -> HAVING COUNT(*) > 1;
  4. +-------------+-------+
  5. | descripcion | total |
  6. +-------------+-------+
  7. | dos         |     2 |
  8. | uno         |     3 |
  9. +-------------+-------+
  10. 2 rows in set (0.00 sec)

es decir, eliminarías 5 registros. Desde aquí me parece que tienes un error de concepto, porque tal como lo pones NO DEJARÍAS NINGUNA OCURRENCIA PARA LAS DESCRIPCIONES UNO Y DOS... lo que usualmente se hace es dejar sólo una de las descripciones y eliminar el resto, pero como esto no es lo que propones, no me voy a entretener en indicarte cómo sería el procedimiento.

Hay una manera en que creo que podrías hacer lo que quieres, y sería utilizando INNER JOIN, sería algo así:


Código MySQL:
Ver original
  1. mysql> DELETE T1.* FROM tabla T1 INNER JOIN
  2.     -> (SELECT descripcion, COUNT(*) total FROM tabla
  3.     -> GROUP BY descripcion
  4.     -> HAVING COUNT(*) > 1) T2 ON T1.descripcion = T2.descripcion;
  5. Query OK, 5 rows affected (0.04 sec)
  6.  
  7. mysql> SELECT * FROM tabla;
  8. +------+-------------+
  9. | id   | descripcion |
  10. +------+-------------+
  11. |    3 | tres        |
  12. |    1 | seis        |
  13. |    2 | siete       |
  14. +------+-------------+
  15. 3 rows in set (0.00 sec)


De esta manera, eliminas los cinco registros que estaban duplicados.

Dale un vistazo para ver si es lo que necesitas-

Saludos
Leo
Hola gracias por tu ayuda , probare lo que me dices, el id de mis registros es unico tengo un campo que se llama cod_alu y es ese que el que se repite y quiero eliminar todos sin excepcion todos esos registros que se repiten me refiero al campo cod_alu, muchas gracias de ante mano.