1
I’m having difficulty performing a JOIN in tables the problem is the following:
In a school bulletin system I have users, including students, guardians and school employees. I need to generate an SQL command that when informing the CPF of the responsible(s), it lists all students related to the CPF of that(s) responsible(is).
Follows the model:
Is this the best way to implement this "Generalization" and this relationship between the responsible ones and the students, since they are all users? Can someone help me?
SQL code:
-- -----------------------------------------------------
-- Table `testeboletim`.`tipo_usuario`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `testeboletim`.`tipo_usuario` (
  `idtipo_usuario` INT NOT NULL AUTO_INCREMENT,
  `funcao` VARCHAR(45) NULL,
  PRIMARY KEY (`idtipo_usuario`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `testeboletim`.`usuario`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `testeboletim`.`usuario` (
  `idusuario` INT NOT NULL AUTO_INCREMENT,
  `nome` VARCHAR(45) NULL,
  `cpf` VARCHAR(20) NULL,
  `data_nasc` DATE NULL,
  `telefone` VARCHAR(20) NULL,
  `celular` VARCHAR(20) NULL,
  `email` VARCHAR(45) NULL,
  `tipo_usuario_idtipo_usuario` INT NOT NULL,
  PRIMARY KEY (`idusuario`, `tipo_usuario_idtipo_usuario`),
  INDEX `fk_usuario_tipo_usuario_idx` (`tipo_usuario_idtipo_usuario` ASC),
  CONSTRAINT `fk_usuario_tipo_usuario`
    FOREIGN KEY (`tipo_usuario_idtipo_usuario`)
    REFERENCES `testeboletim`.`tipo_usuario` (`idtipo_usuario`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `testeboletim`.`aluno`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `testeboletim`.`aluno` (
  `idaluno` INT NOT NULL AUTO_INCREMENT,
  `usuario_idusuario` INT NOT NULL,
  `usuario_tipo_usuario_idtipo_usuario` INT NOT NULL,
  PRIMARY KEY (`idaluno`, `usuario_idusuario`, `usuario_tipo_usuario_idtipo_usuario`),
  INDEX `fk_aluno_usuario1_idx` (`usuario_idusuario` ASC, `usuario_tipo_usuario_idtipo_usuario` ASC),
  CONSTRAINT `fk_aluno_usuario1`
    FOREIGN KEY (`usuario_idusuario` , `usuario_tipo_usuario_idtipo_usuario`)
    REFERENCES `testeboletim`.`usuario` (`idusuario` , `tipo_usuario_idtipo_usuario`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `testeboletim`.`responsavel`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `testeboletim`.`responsavel` (
  `idresponsavel` INT NOT NULL AUTO_INCREMENT,
  `usuario_idusuario` INT NOT NULL,
  `usuario_tipo_usuario_idtipo_usuario` INT NOT NULL,
  PRIMARY KEY (`idresponsavel`, `usuario_idusuario`, `usuario_tipo_usuario_idtipo_usuario`),
  INDEX `fk_responsavel_usuario1_idx` (`usuario_idusuario` ASC, `usuario_tipo_usuario_idtipo_usuario` ASC),
  CONSTRAINT `fk_responsavel_usuario1`
    FOREIGN KEY (`usuario_idusuario` , `usuario_tipo_usuario_idtipo_usuario`)
    REFERENCES `testeboletim`.`usuario` (`idusuario` , `tipo_usuario_idtipo_usuario`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `testeboletim`.`aluno_has_responsavel`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `testeboletim`.`aluno_has_responsavel` (
  `aluno_idaluno` INT NOT NULL,
  `aluno_usuario_idusuario` INT NOT NULL,
  `responsavel_idresponsavel` INT NOT NULL,
  `responsavel_usuario_idusuario` INT NOT NULL,
  PRIMARY KEY (`aluno_idaluno`, `aluno_usuario_idusuario`, `responsavel_idresponsavel`, `responsavel_usuario_idusuario`),
  INDEX `fk_aluno_has_responsavel_responsavel1_idx` (`responsavel_idresponsavel` ASC, `responsavel_usuario_idusuario` ASC),
  INDEX `fk_aluno_has_responsavel_aluno1_idx` (`aluno_idaluno` ASC, `aluno_usuario_idusuario` ASC),
  CONSTRAINT `fk_aluno_has_responsavel_aluno1`
    FOREIGN KEY (`aluno_idaluno` , `aluno_usuario_idusuario`)
    REFERENCES `testeboletim`.`aluno` (`idaluno` , `usuario_idusuario`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_aluno_has_responsavel_responsavel1`
    FOREIGN KEY (`responsavel_idresponsavel` , `responsavel_usuario_idusuario`)
    REFERENCES `testeboletim`.`responsavel` (`idresponsavel` , `usuario_idusuario`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;


I wouldn’t do CPF related. As the user profile can have multiple roles and privileges on multiple program screens. It may be desired that at some point, you as a system manager, Log as a user to see if everything goes as you imagined. So I would link this to the profile of the person who is logging in and not to her social security number.
– Reginaldo Rigo