2016-12-23 1 views
1

나는 테이블에 문제가 가입 수행하는 데 문제로 테이블을 조인하는 방법이있다.일반화

Model

는이를 구현하는 가장 좋은 방법입니다 : 나는 부모의 액세스 ID를 입력 할 때 부모의 ID와 관련된 모든 학생들

는 모델에 따라 나열되어 있다는 SQL 문을 생성해야 "일반화"와 부모와 학생 간의 이러한 관계는 모든 사용자이므로? 누군가 나를 도울 수 있습니까?

SQL 코드 :

 -- ----------------------------------------------------- 
     -- Table `testeboletim`.`type_user` 
     -- ----------------------------------------------------- 
     CREATE TABLE IF NOT EXISTS `testeboletim`.`type_user` (
      `idtype_user` INT NOT NULL AUTO_INCREMENT, 
      `role` VARCHAR(45) NULL, 
      PRIMARY KEY (`idtype_user`)) 
     ENGINE = InnoDB; 


     -- ----------------------------------------------------- 
     -- Table `testeboletim`.`user` 
     -- ----------------------------------------------------- 
     CREATE TABLE IF NOT EXISTS `testeboletim`.`user` (
      `iduser` INT NOT NULL AUTO_INCREMENT, 
      `name` VARCHAR(45) NULL, 
      `ID` VARCHAR(20) NULL, 
      `birth` DATE NULL, 
      `telephone` VARCHAR(20) NULL, 
      `phone` VARCHAR(20) NULL, 
      `email` VARCHAR(45) NULL, 
      `type_user_idtype_user` INT NOT NULL, 
      PRIMARY KEY (`iduser`, `type_user_idtype_user`), 
      INDEX `fk_usuario_tipo_usuario_idx` (`type_user_idtype_user` ASC), 
      CONSTRAINT `fk_usuario_tipo_usuario` 
      FOREIGN KEY (`type_user_idtype_user`) 
      REFERENCES `testeboletim`.`type_user` (`idtype_user`) 
      ON DELETE NO ACTION 
      ON UPDATE NO ACTION) 
     ENGINE = InnoDB; 


     -- ----------------------------------------------------- 
     -- Table `testeboletim`.`student` 
     -- ----------------------------------------------------- 
     CREATE TABLE IF NOT EXISTS `testeboletim`.`student` (
      `idstudent` INT NOT NULL AUTO_INCREMENT, 
      `user_iduser` INT NOT NULL, 
      `user_type_user_idtype_user` INT NOT NULL, 
      PRIMARY KEY (`idstudent`, `user_iduser`, `user_type_user_idtype_user`), 
      INDEX `fk_aluno_usuario1_idx` (`user_iduser` ASC, `user_type_user_idtype_user` ASC), 
      CONSTRAINT `fk_aluno_usuario1` 
      FOREIGN KEY (`user_iduser` , `user_type_user_idtype_user`) 
      REFERENCES `testeboletim`.`user` (`iduser` , `type_user_idtype_user`) 
      ON DELETE NO ACTION 
      ON UPDATE NO ACTION) 
     ENGINE = InnoDB; 


     -- ----------------------------------------------------- 
     -- Table `testeboletim`.`parents` 
     -- ----------------------------------------------------- 
     CREATE TABLE IF NOT EXISTS `testeboletim`.`parents` (
      `idparents` INT NOT NULL AUTO_INCREMENT, 
      `user_iduser` INT NOT NULL, 
      `user_type_user_idtype_user` INT NOT NULL, 
      PRIMARY KEY (`idparents`, `user_iduser`, `user_type_user_idtype_user`), 
      INDEX `fk_responsavel_usuario1_idx` (`user_iduser` ASC, `user_type_user_idtype_user` ASC), 
      CONSTRAINT `fk_responsavel_usuario1` 
      FOREIGN KEY (`user_iduser` , `user_type_user_idtype_user`) 
      REFERENCES `testeboletim`.`user` (`iduser` , `type_user_idtype_user`) 
      ON DELETE NO ACTION 
      ON UPDATE NO ACTION) 
     ENGINE = InnoDB; 


     -- ----------------------------------------------------- 
     -- Table `testeboletim`.`student_has_parents` 
     -- ----------------------------------------------------- 
     CREATE TABLE IF NOT EXISTS `testeboletim`.`student_has_parents` (
      `student_idstudent` INT NOT NULL, 
      `student_user_iduser` INT NOT NULL, 
      `parents_idparents` INT NOT NULL, 
      `parents_user_iduser` INT NOT NULL, 
      PRIMARY KEY (`student_idstudent`, `student_user_iduser`, `parents_idparents`, `parents_user_iduser`), 
      INDEX `fk_aluno_has_responsavel_responsavel1_idx` (`parents_idparents` ASC, `parents_user_iduser` ASC), 
      INDEX `fk_aluno_has_responsavel_aluno1_idx` (`student_idstudent` ASC, `student_user_iduser` ASC), 
      CONSTRAINT `fk_aluno_has_responsavel_aluno1` 
      FOREIGN KEY (`student_idstudent` , `student_user_iduser`) 
      REFERENCES `testeboletim`.`student` (`idstudent` , `user_iduser`) 
      ON DELETE NO ACTION 
      ON UPDATE NO ACTION, 
      CONSTRAINT `fk_aluno_has_responsavel_responsavel1` 
      FOREIGN KEY (`parents_idparents` , `parents_user_iduser`) 
      REFERENCES `testeboletim`.`parents` (`idparents` , `user_iduser`) 
      ON DELETE NO ACTION 
      ON UPDATE NO ACTION) 
     ENGINE = InnoDB; 


     SET [email protected]_SQL_MODE; 
     SET [email protected]_FOREIGN_KEY_CHECKS; 
     SET [email protected]_UNIQUE_CHECKS; 
+0

정말 별도의'parents'와'student' 테이블에 대한 필요가 없어졌다. 이 상황에서, 각각의'student_has_parents'는 단순히'user'에 대한 두 개의 분리 된 참조를 가질 것입니다. 내가 제안하는 접근법의 유일한 단점은 순전히 MySQL에서 순전히 "사용자"가 관계의 부적절한 부분에서 끝나지 않을 것임을 확실히하는 것이 간단하지 않다는 것이다. 하지만 부적절한 사용자를 삭제하는 것이 바람직한 표를 유지하는 것과 유사한 문제가 발생할 수 있습니다. – Uueerdo

답변

1

이 문제를 해결하기 위해, 우리는 testeboletim 볼 필요가있다. student, testeboletim. parentstesteboletim입니다. student_has_parents 또는 testeboletim. user. 귀하의 문제를 해결하기로 결정했습니다 testeboletim. user입니다. 왜냐하면 refrence key의 관점에서 더 명확했기 때문입니다.

testeboletim을 사용하는 솔루션. 귀하의 질문을 바탕으로

user, 우리는 testeboletim의 모든 행을 찾고 있습니다. student이고, 해당하는 idusertesteboletim입니다. user이고, 은 testeboletim이다. parents.

- SQL 정의 :

이제
SELECT * FROM `testeboletim`.`student` WHERE `user_iduser` IN 
     (SELECT DISTINCT(`iduser`) FROM `testeboletim`.`user` WHERE `iduser` IN 
       (SELECT DISTINCT(`user_iduser`) FROM `testeboletim`.`parents`) 
     ); 

LEFT JOIN의 사용을 요구, JOIN과 같은 일을 할; 이 경우 testeboletim입니다. student.

SELECT * FROM `testeboletim`.`student` AS `student` 
LEFT JOIN `testeboletim`.`user` AS `user` 
ON `student`.`user_iduser` = `user`.`iduser` 
LEFT JOIN `testeboletim`.`parents` AS `parents` 
ON `user`.`iduser` = `parents`.`user_iduser`; 

내가 어떤 값을 가지고 있지 않기 때문에

, 나는 쿼리가 작동하는지 "증명"하기 위해, 당신과 함께 설명을 공유하는거야. (아마도`type_user` 이미합니까?)을 구별하는`user` 테이블에 뭔가가있는 경우

mysql> SELECT * FROM `testeboletim`.`student` AS `student` 
    ->  LEFT JOIN `testeboletim`.`user` AS `user` 
    ->  ON `student`.`user_iduser` = `user`.`iduser` 
    ->  LEFT JOIN `testeboletim`.`parents` AS `parents` 
    ->  ON `user`.`iduser` = `parents`.`user_iduser`; 
Empty set (0.01 sec) 

mysql> EXPLAIN SELECT * FROM `testeboletim`.`student` AS `student` 
    ->  LEFT JOIN `testeboletim`.`user` AS `user` 
    ->  ON `student`.`user_iduser` = `user`.`iduser` 
    ->  LEFT JOIN `testeboletim`.`parents` AS `parents` 
    ->  ON `user`.`iduser` = `parents`.`user_iduser`; 
+------+-------------+---------+-------+-----------------------------+-----------------------------+---------+--------------------------+------+-------------------------------------------------+ 
| id | select_type | table | type | possible_keys    | key       | key_len | ref      | rows | Extra           | 
+------+-------------+---------+-------+-----------------------------+-----------------------------+---------+--------------------------+------+-------------------------------------------------+ 
| 1 | SIMPLE  | student | index | NULL      | PRIMARY      | 12  | NULL      | 1 | Using index          | 
| 1 | SIMPLE  | user | ALL | PRIMARY      | NULL      | NULL | NULL      | 1 | Using where; Using join buffer (flat, BNL join) | 
| 1 | SIMPLE  | parents | ref | fk_responsavel_usuario1_idx | fk_responsavel_usuario1_idx | 4  | testeboletim.user.iduser | 1 | Using where; Using index      | 
+------+-------------+---------+-------+-----------------------------+-----------------------------+---------+--------------------------+------+-------------------------------------------------+ 
3 rows in set (0.00 sec)