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

Delete en una consulta

Estas en el tema de Delete en una consulta en el foro de Mysql en Foros del Web. Hola Tengo un problema , tengo esta consulta @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original SELECT * , COUNT ( * ) AS Repetido FROM alumno ...
  #1 (permalink)  
Antiguo 10/02/2014, 12:48
 
Fecha de Ingreso: diciembre-2013
Mensajes: 108
Antigüedad: 11 años
Puntos: 1
Delete en una consulta

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.
  #2 (permalink)  
Antiguo 12/02/2014, 03:36
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 9 meses
Puntos: 574
Respuesta: Delete en una consulta

TODOS?

Si tienes un identificador único es fácil
Código MySQL:
Ver original
  1. SELECT idAlumno INTO TablaTemporal
  2. FROM alumno
  3. GROUP BY cod_alu, ape_pat, ape_mat
  4. HAVING COUNT( * ) >1;
  5.  
  6. DELETE FROM alumno WHERE  idAlumno IN (SELECT idAlumno FROM TablaTemporal);
  7.  
  8. DROP TABLE TablaTemporal;
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 12/02/2014, 10:27
 
Fecha de Ingreso: diciembre-2013
Mensajes: 108
Antigüedad: 11 años
Puntos: 1
Respuesta: Delete en una consulta

Gracias de ante mano mira me sale un error no se si me puedes ayudar
Código MySQL:
Ver original
  1. Error
  2. consulta SQL: Documentación
  3.  
  4. SELECT id_alumno
  5. INTO TablaTemporal
  6. FROM alumno
  7. GROUP BY cod_alu, ape_pat, ape_mat
  8. HAVING COUNT( * ) >1;
  9.  
  10.  
  11. MySQL ha dicho: Documentación
  12.  
  13. #1327 - Undeclared variable: TablaTemporal

Última edición por gnzsoloyo; 12/02/2014 a las 10:44
  #4 (permalink)  
Antiguo 12/02/2014, 10:45
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Delete en una consulta

Eso sólo puede funcionar si es en un SP, y con "tablaTemporal" declarado como variable.
¿En qué contexto lo estás usando?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 12/02/2014, 11:25
 
Fecha de Ingreso: diciembre-2013
Mensajes: 108
Antigüedad: 11 años
Puntos: 1
Respuesta: Delete en una consulta

No estoy usando procedimientos almacenados solo haciendo una consulta desde el mismo mysql y quiero borrar todo lo que esa consulta me bota.
  #6 (permalink)  
Antiguo 12/02/2014, 11:31
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Delete en una consulta

Ok.
Si la query devuelve más de un registro, no podrás hacerlo por consola. Deberás crear un SP para eso.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 12/02/2014, 11:58
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
  #8 (permalink)  
Antiguo 12/02/2014, 12:29
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Delete en una consulta

No nos olvidemos que en MySQL no puedes consultar y borrar la misma tabla en la misma consulta.
De allí la sugerencia de usar un SP, que permita iterar las duplicidades, ya que permitiría no borrar las que no se debe...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 12/02/2014, 14:56
 
Fecha de Ingreso: diciembre-2013
Mensajes: 108
Antigüedad: 11 años
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.
  #10 (permalink)  
Antiguo 12/02/2014, 15:07
 
Fecha de Ingreso: diciembre-2013
Mensajes: 108
Antigüedad: 11 años
Puntos: 1
Respuesta: Delete en una consulta

Cita:
Iniciado por gnzsoloyo Ver Mensaje
No nos olvidemos que en MySQL no puedes consultar y borrar la misma tabla en la misma consulta.
De allí la sugerencia de usar un SP, que permita iterar las duplicidades, ya que permitiría no borrar las que no se debe...
En todo caso si no se puede borrar registros con SELECT sin SP entonces se podria pasar los registros que no son duplicados a otra tabla?, ojo solo pasando los registros que no son duplicados no me interesa que un registro duplicado se pase, muchas gracias de ante mano.

Etiquetas: delete, registro, select
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 07:38.