Ver Mensaje Individual
  #7 (permalink)  
Antiguo 12/02/2014, 11:58
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 11 meses
Puntos: 447
Respuesta: Delete en una consulta

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