Ver Mensaje Individual
  #6 (permalink)  
Antiguo 08/05/2009, 18:21
Avatar de cala932
cala932
 
Fecha de Ingreso: septiembre-2006
Ubicación: San Juan-Argentina
Mensajes: 902
Antigüedad: 17 años, 7 meses
Puntos: 9
Respuesta: Sentencia SQL

Holas tokero analizando bien la base de datos no esta bien armada, aca te dejo un script de como deberia ser realmente la estructura de tu base suponiendo que la base de datos se llame universidad:
Te explico lo siguiente, de esta manera logras mantener la relacion de que estudios osea materias hay en cada colegio y por el otro lado la relacion de que materias esta cursando cada estudiante en que colegio. Como las tenias planteadas antes, la tabla estudiantes deberia repetir un registro por cada colegio y materia cursada, o en su defecto el id del estudiante deberia estar en la tabla relacion, pero puede darse el caso de que exista una materia en ese colegio y no tenga estudiantes asignados por lo que el id del estudiante en ese caso deberia aceptar valores nulos en la tabla relacion. Entonces para asegurar la integridad de los datos te propongo esta estructura, la cual a su vez te facilitar futuras consultas.
Código:
CREATE SCHEMA IF NOT EXISTS `universidad` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ;
USE `universidad`;

-- -----------------------------------------------------
-- Table `universidad`.`estudiante`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `universidad`.`estudiante` (
  `id_estudiante` INT NOT NULL AUTO_INCREMENT ,
  `nombre` VARCHAR(45) NOT NULL ,
  `apellido` VARCHAR(45) NOT NULL ,
  PRIMARY KEY (`id_estudiante`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `universidad`.`materia`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `universidad`.`materia` (
  `id_materia` INT NOT NULL AUTO_INCREMENT ,
  `nombre` VARCHAR(45) NOT NULL ,
  `descripcion` VARCHAR(45) NOT NULL ,
  PRIMARY KEY (`id_materia`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `universidad`.`colegio`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `universidad`.`colegio` (
  `id_colegio` INT NOT NULL AUTO_INCREMENT ,
  `nombre` VARCHAR(45) NOT NULL ,
  PRIMARY KEY (`id_colegio`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `universidad`.`colegio_materia`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `universidad`.`colegio_materia` (
  `id_colegio` INT NOT NULL ,
  `id_materia` INT NOT NULL ,
  PRIMARY KEY (`id_colegio`, `id_materia`) ,
  INDEX `fk_colegio_has_materia_colegio` (`id_colegio` ASC) ,
  INDEX `fk_colegio_has_materia_materia` (`id_materia` ASC) ,
  CONSTRAINT `fk_colegio_has_materia_colegio`
    FOREIGN KEY (`id_colegio` )
    REFERENCES `universidad`.`colegio` (`id_colegio` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_colegio_has_materia_materia`
    FOREIGN KEY (`id_materia` )
    REFERENCES `universidad`.`materia` (`id_materia` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION);


-- -----------------------------------------------------
-- Table `universidad`.`estudiante_colegio_materia`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `universidad`.`estudiante_colegio_materia` (
  `id_estudiante` INT NOT NULL ,
  `id_colegio` INT NOT NULL ,
  `id_materia` INT NOT NULL ,
  PRIMARY KEY (`id_estudiante`, `id_colegio`, `id_materia`) ,
  INDEX `fk_estudiante_has_colegio_materia_estudiante` (`id_estudiante` ASC) ,
  INDEX `fk_estudiante_has_colegio_materia_colegio_materia` (`id_colegio` ASC, `id_materia` ASC) ,
  CONSTRAINT `fk_estudiante_has_colegio_materia_estudiante`
    FOREIGN KEY (`id_estudiante` )
    REFERENCES `universidad`.`estudiante` (`id_estudiante` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_estudiante_has_colegio_materia_colegio_materia`
    FOREIGN KEY (`id_colegio` , `id_materia` )
    REFERENCES `universidad`.`colegio_materia` (`id_colegio` , `id_materia` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION);
Puedes agregar mas campos si lo deseas, espero que te sirva. Te envio a tu correo una imagen del diagrama.

Y para obtener los datos que deseas, utilizas la siguiente consulta:
Código:
SELECT * FROM estudiante es JOIN estudiante_colegio_materia ecm ON es.id_estudiante
= ecm.id_estudiante JOIN materia m ON ecm.id_materia = m.id_materia JOIN colegio col ON
col.id_colegio = ecm.id_colegio
Espero haberte ayudado.

Saludos


Saludos
__________________
->Aprender es un proceso que incluye el error..

Última edición por cala932; 08/05/2009 a las 19:33