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