2016-12-23 4 views
1

У меня возникли проблемы, выполняющие РЕГИСТРИРУЙТЕСЬ таблицы проблемы заключается в следующем:как объединения таблиц с обобщением

В докладе корзина системы у меня есть пользователи, такие как студенты, родители и сотрудники школы. Мне нужно создать оператор SQL, что, когда я ввожу код доступа родителей он перечисляет всех студентов, связанных с родителями ID

следовать модели:

Model

Это лучший способ осуществить это «Обобщение» и эти отношения между родителями и учениками, поскольку все они являются пользователями? Кто-нибудь может мне помочь?

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

Там не должно быть действительно необходимость в отдельном '' и с родителями student' таблицы, если есть что-то в 'user' таблицу, которая отличает их (возможно,' type_user' уже делает?). В этой ситуации каждый 'student_has_parents' просто имел бы две отдельные ссылки на' user'. Единственным недостатком подхода, который я предлагаю, является то, что в MySQL не просто просто убедиться, что «пользователь» не окажется на несоответствующей стороне отношения; но у вас возникнут аналогичные проблемы с тем, чтобы неуместные пользователи не использовали таблицы, которые я предлагаю устранить. – Uueerdo

ответ

1

Для того, чтобы решить эту проблему, мы должны смотреть на testeboletim. student, testeboletim. parents, и либо testeboletim. student_has_parents или testeboletim. user. Я решил решить вашу проблему, используя testeboletim. user, потому что это было более ясно с точки зрения ключей подтверждения, а что нет.

Решение с использованием testeboletim. user

Основываясь на вашем запросе, мы ищем все строки в testeboletim. student, которые имеют соответствующие idusertesteboletim. user на основе user_iduser от 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`) 
     ); 

Теперь, чтобы сделать то же самое с JOIN, требует использования LEFT 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`; 

Поскольку у меня нет никаких ценностей, я собираюсь поделиться с вами объяснение для того, чтобы «доказать», что запрос работает.

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) 
Смежные вопросы