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

como hago esta consulta?

Estas en el tema de como hago esta consulta? en el foro de Bases de Datos General en Foros del Web. Hola amigos del foro llevo rato dandole la vuelta a esta consulta pero no se en verdad como hacerla. el caso es que quiero borrar ...
  #1 (permalink)  
Antiguo 16/05/2010, 13:05
 
Fecha de Ingreso: febrero-2010
Mensajes: 24
Antigüedad: 14 años, 2 meses
Puntos: 0
como hago esta consulta?

Hola amigos del foro

llevo rato dandole la vuelta a esta consulta pero no se en verdad como hacerla. el caso es que quiero borrar en una tabla segun un criterio y los ids que se borran ahi, tomarlos para poder borrar en otra tabla.

aca les dejo lo que tengo pensado de las consultas para que se lleven la idea.

ojala puedan ayudarme. gracias a todos

aca relaciono 3 tablas. una tabla para los anuncios, otra con las imagenes de estos anuncios y otra que relaciona cada anuncio con sus imagenes. yo tengo los id de los anuncios que quiero borrar y quiero para poder borrar en la tabla images las imagenes que corresponden a los anuncios pero para eso necesito los ids de esas imagenes. como los devuelvo????

//de aqui quiero los ids de las imagenes borradas
$sql = 'DELETE FROM advertisement_image WHERE id_advertisement = '.$adv;

//esto se supone va en un ciclo segun las imagines anteriores
$sql1 = 'DELETE FROM image WHERE id_image = '.$image.' LIMIT 1';

//
$sql2 = 'DELETE FROM advertisement WHERE id_advertisement = '.$adv.' LIMIT 1';
  #2 (permalink)  
Antiguo 16/05/2010, 13:18
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: como hago esta consulta?

La primera pregunta sería saber si las tablas que usas (suponiendo que usas MySQL) son InnoDB o MyISAM. Porque la respuesta sería diferente en cada caso y las mejores opciones también.
El otro problema es que tal y como las has planteado, si cada imagen en image, pertenece a un sólo aviso en advertisement, la tabla advertisement_image es redundante, porque sólo se necesitaría una FK en image referida a advertisement para cumplir con la dependencia.
El modelo de tres tablas sólo tiene sentido si las imágenes no dependieran funcionalmente de advertisement, y pudieran conservarse sin su existencia.
¿Ese es el modelo que pretendes?

En el caso de las InnoDB, se puede poner como cláusula en la declaración de la FK, "ON DELETE CASCADE", condición que haría que el borrado de un registro en advertisement borrase en cascada todas sus relaciones dependientes.
En cambio si las tablas son MyISAM, se debe hacer de otra forma, aunque hay modos mejores que lo que propones.


Un tip que tienes que tener en cuenta es que LIMIT es una cláusula de SELECT, no de UPDATE ni de DELETE. Y además, es una cláusula opcional que sólo tiene sentido necesitas un registro de todo un conjunto devuelto. En tu caso, no tiene ningún sentido borrar de a uno los registros, si ya sabes cuál es el conjunto de registros que quieres eliminar.
Hay otras formas más eficientes de hacerlo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 16/05/2010, 14:20
 
Fecha de Ingreso: febrero-2010
Mensajes: 24
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: como hago esta consulta?

Hola gnzsoloyo

muchisimas gracias por tu ayuda, la verdad es que esto se me ha hecho un poco complicado.

te explico, uso MySQL y las tablas son InnoDB.
tengo una tabla anuncio y una tabla images donde almaceno varias imagenes para un anuncio, por eso es que las almaceno aparte del anuncio. la tabla advertisement_image es solo para relacionar las otras dos tablas a lahora de haer los selects. gracias a dios hasta ahora todo eso me ha funcionado bien.
tienes razon con lo de la existencia de los anuncios, si se borra el anuncio, no tienen sentido las imagenes. pero en este caso que o trabajo con FK como puedo utilizar la clausula "ON DELETE CASCADE"??? o existe algo parecido que me resuelva??

aca te dejo la declaracion SQL de las tablas por si te aclara mas.

gracias por tu ayuda.

Código:
CREATE TABLE `image` (
  `id_image` int(11) unsigned zerofill NOT NULL auto_increment,
  `image_location` varchar(100) NOT NULL default '../images/adv/default.jpg',
  `thumb_location` varchar(100) NOT NULL default '../images/thumbs_adv/default.gif',
  PRIMARY KEY  (`id_image`),
  UNIQUE KEY `id_image` (`id_image`),
  UNIQUE KEY `image_location` (`image_location`),
  UNIQUE KEY `thumb_location` (`thumb_location`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;

Código:
CREATE TABLE `advertisement_image` (
  `id_advertisement` int(11) unsigned zerofill NOT NULL,
  `id_image` int(11) unsigned zerofill NOT NULL,
  PRIMARY KEY  (`id_advertisement`,`id_image`),
  KEY `id_advertisement` (`id_advertisement`),
  KEY `id_image` (`id_image`),
  CONSTRAINT `advertisement_image_ibfk_1` FOREIGN KEY (`id_advertisement`) REFERENCES `advertisement` (`id_advertisement`),
  CONSTRAINT `advertisement_image_ibfk_2` FOREIGN KEY (`id_image`) REFERENCES `image` (`id_image`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Código:
CREATE TABLE `advertisement` (
  `id_advertisement` int(11) unsigned zerofill NOT NULL auto_increment,
  `adv_subject` text NOT NULL,
  `price` varchar(20) default NULL,
  `description` longtext,
  `address` text,
  `contact_email` varchar(50) default NULL,
  `contact_telephone` varchar(20) default NULL,
  `visitors_number` int(6) unsigned NOT NULL default '0',
  `publication_date` datetime NOT NULL
  PRIMARY KEY  (`id_advertisement`),
  UNIQUE KEY `id_advertisement` (`id_advertisement`)
) ENGINE=InnoDB AUTO_INCREMENT=60 DEFAULT CHARSET=latin1;
  #4 (permalink)  
Antiguo 16/05/2010, 14:39
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: como hago esta consulta?

En esencia el modelo funcional para tu caso sería:

Código MySQL:
Ver original
  1. CREATE TABLE `advertisement` (
  2.   `id_advertisement` int(11) unsigned zerofill NOT NULL auto_increment,
  3.   `adv_subject` text NOT NULL,
  4.   `price` varchar(20) default NULL,
  5.   `description` longtext,
  6.   `address` text,
  7.   `contact_email` varchar(50) default NULL,
  8.   `contact_telephone` varchar(20) default NULL,
  9.   `visitors_number` int(6) unsigned NOT NULL default '0',
  10.   `publication_date` datetime NOT NULL
  11.   PRIMARY KEY  (`id_advertisement`),
  12.   UNIQUE KEY `id_advertisement` (`id_advertisement`)
  13.  
  14. CREATE TABLE `image` (
  15.   `image_location` varchar(100) NOT NULL default '../images/adv/default.jpg',
  16.   `thumb_location` varchar(100) NOT NULL default '../images/thumbs_adv/default.gif',
  17. `id_advertisement` int(11) unsigned zerofill NOT NULL,
  18.   PRIMARY KEY  (`id_image`),
  19.   UNIQUE KEY `id_image` (`id_image`),
  20.   UNIQUE KEY `image_location` (`image_location`),
  21.   UNIQUE KEY `thumb_location` (`thumb_location`)
  22.   CONSTRAINT `advertisement_image_ibfk` FOREIGN KEY (`id_advertisement`) REFERENCES `advertisement` (`id_advertisement`) ON UPDATE CASCADE ON DELETE CASCADE,

Eso define la relación adevertisement con image de la forma 1:N, y hace que si borras el registro en advertisement, todos los registros donde aparezca su id, se borren en cascada.

Si no quieres modificar nada, simplemente tu tabla adevertisement_image, debe incluir un TRIGGER que permita borrar la tabla image luego de eliminar el registro, o bien manejar ese borrado en la aplicación.
La idea sería algo como esto:
Código MySQL:
Ver original
  1. DELETE FROM advertisemenet A
  2.     INNER JOIN advertisemenet_image AI  ON A.id_advertisement = AI.id_advertisement
  3.     INNER JOIN image I  ON AI.id_image  = I.id_image
  4. WHERE A.id_advertisement = valorbuscado;
Donde valorbuscado en un valor de ID pasado por la aplciación.
El uso del FORM en este caso, según manual:
Cita:
sólo los registros coincidentes de las tablas listadas en la cláusula FROM se borran. El efecto es que puede borrar registros para varias tablas al mismo tiempo
Habría que probar, pero se supone que la sentencia usada de esa forma funcionaría correctamente.
__________________
¿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 16/05/2010, 22:38
 
Fecha de Ingreso: febrero-2010
Mensajes: 24
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: como hago esta consulta?

muchisisisisimas gracias por tu ayuda
me fui por la primera opcion de borrar la tabla advertisement_image y poner una relacion 1:N en image. la verdad es que el diseño de la base de datos es fundamental.
funciona a la perfeccion.
gracias de nuevo
  #6 (permalink)  
Antiguo 16/05/2010, 22:50
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: como hago esta consulta?

: adios:
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
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 13:26.