通过循环遍历MySQL中特定表中的ROWS来创建几个表

时间:2015-01-14 17:29:50

标签: mysql sql loops rows create-table

我如何在MySQL中使用循环遍历主题表,并使用数学 Econs 为每个主题创建一个表,如下所示, Chem 作为例子。仅作为最后的手段使用PHP。

表: SUBJECTS

|主题|单位|工作人员|

|数学| 3 |詹姆斯先生|
 | Econs | 1 |史密斯博士|
 |化学| 2 |艾莎太太|

表: MATHS

学生| TEST1 | TEST2 |考试|

101 | 10 | 20 | 30 | 105 | 11 | 09 | 45 |

表: ECONS

学生| TEST1 | TEST2 |考试|

101 | 10 | 20 | 30 | 105 | 11 | 09 | 45 |

表: CHEM

学生| TEST1 | TEST2 |考试|

101 | 10 | 20 | 30 | 105 | 11 | 09 | 45 |

1 个答案:

答案 0 :(得分:0)

在设计数据库时,首先需要确定支持目标所需的所有实体。在您的情况下,您需要跟踪学生以及他们在各种课程/科目中的成绩。

基于此,我们可以识别以下实体:

  1. 数学,化学等科目。
  2. 为这些科目参加考试和考试的学生。
  3. 负责教授科目和准备考试/考试的工作人员。
  4. 不同类型的测试,即课堂测试,考试等。
  5. 特定科目中特定类型考试的学生成绩。
  6. 所以基于这个(相当简化的场景,我们只需要5个表。第二个是识别实体之间的关系。让我们回顾一下。

    1. 主题只能由一名工作人员提出,但工作人员可以提供许多科目。例如,数学只由琼斯先生讲授,但琼斯先生教授数学和科学。这就是我们所谓的一对多关系。
    2. 学生可以在许多科目中取得很多成绩,而且科目可以让很多学生有很多成绩。例如,学生1参加考试和数学考试,得到两个不同的结果。数学科目可能有100个学生,每个学生都记录了一个或多个结果。这是一对多关系。
    3. 学生的每个成绩都是某种类型的考试或考试。因此这里有一对多的关系。只有一种考试类型,但数学,科学,地理和历史都使用此考试类型。
    4. 所以基于这一切都创建了一个小型的演示数据库。我会带你通过它。

      以下是结构的直观表示: enter image description here

      以下是数据库的代码。

      CREATE SCHEMA IF NOT EXISTS `coursedb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
      USE `coursedb` ;
      
      -- -----------------------------------------------------
      -- Table `coursedb`.`staff`
      -- -----------------------------------------------------
      CREATE TABLE IF NOT EXISTS `coursedb`.`staff` (
       `staff_ID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
       `staff_name` VARCHAR(64) NOT NULL,
       `staff_surname` VARCHAR(64) NOT NULL,
       `staff_title` VARCHAR(64) NOT NULL,
        PRIMARY KEY (`staff_ID`))
      ENGINE = InnoDB;
      
      
      -- -----------------------------------------------------
      -- Table `coursedb`.`subject`
      -- -----------------------------------------------------
      CREATE TABLE IF NOT EXISTS `coursedb`.`subject` (
      `subject_ID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
      `subject_name` VARCHAR(64) NULL,
      `staff_ID` INT UNSIGNED NOT NULL,
      PRIMARY KEY (`subject_ID`),
      INDEX `fk_subject_staff_idx` (`staff_ID` ASC),
      CONSTRAINT `fk_subject_staff`
        FOREIGN KEY (`staff_ID`)
        REFERENCES `coursedb`.`staff` (`staff_ID`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION
      )
      ENGINE = InnoDB;
      
      -- -----------------------------------------------------
      -- Table `coursedb`.`student`
      -- -----------------------------------------------------
      CREATE TABLE IF NOT EXISTS `coursedb`.`student` (
        `student_ID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
        `student_name` VARCHAR(64) NOT NULL,
        PRIMARY KEY (`student_ID`))
      ENGINE = InnoDB;
      
      
      -- -----------------------------------------------------
      -- Table `coursedb`.`subject_result_type`
      -- -----------------------------------------------------
      CREATE TABLE IF NOT EXISTS `coursedb`.`subject_result_type` (
        `subject_result_type_ID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
        `subject_result_type_name` VARCHAR(64) NOT NULL,
        PRIMARY KEY (`subject_result_type_ID`))
      ENGINE = InnoDB;
      
      
      -- -----------------------------------------------------
      -- Table `coursedb`.`subject_student_result`
      -- -----------------------------------------------------
      CREATE TABLE IF NOT EXISTS `coursedb`.`subject_student_result` (
        `subject_ID` INT UNSIGNED NOT NULL,
        `student_ID` INT UNSIGNED NOT NULL,
        `subject_student_result_date` DATE NOT NULL,
        `subject_student_result_score` INT NOT NULL,
        `subject_result_type_ID` INT UNSIGNED NOT NULL,
        PRIMARY KEY (`subject_ID`, `student_ID`, `subject_student_result_date`),
        INDEX `fk_subject_student_result_subject1_idx` (`subject_ID` ASC),
        INDEX `fk_subject_student_result_student1_idx` (`student_ID` ASC),
        INDEX `fk_subject_student_result_subject_result_type1_idx`  (`subject_result_type_ID` ASC),
        CONSTRAINT `fk_subject_student_result_subject1`
          FOREIGN KEY (`subject_ID`)
          REFERENCES `coursedb`.`subject` (`subject_ID`)
          ON DELETE NO ACTION
          ON UPDATE NO ACTION,
        CONSTRAINT `fk_subject_student_result_student1`
          FOREIGN KEY (`student_ID`)
          REFERENCES `coursedb`.`student` (`student_ID`)
          ON DELETE NO ACTION
          ON UPDATE NO ACTION,
        CONSTRAINT `fk_subject_student_result_subject_result_type1`
          FOREIGN KEY (`subject_result_type_ID`)
          REFERENCES `coursedb`.`subject_result_type` (`subject_result_type_ID`)
          ON DELETE NO ACTION
          ON UPDATE NO ACTION)
      ENGINE = InnoDB;
           CREATE TABLE IF NOT EXISTS `coursedb`.`subject` (
             `subject_ID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
             `subject_name` VARCHAR(64) NULL,
             `staff_ID` INT UNSIGNED NOT NULL,
             PRIMARY KEY (`subject_ID`),
             INDEX `fk_subject_staff_idx` (`staff_ID` ASC),
             CONSTRAINT `fk_subject_staff`
               FOREIGN KEY (`staff_ID`)
               REFERENCES `coursedb`.`staff` (`staff_ID`)
               ON DELETE NO ACTION
               ON UPDATE NO ACTION)
           ENGINE = InnoDB;
      

      让我们开始添加一些数据,以便您可以看到这些数据如何组合在一起。首先,让我们加入两位工作人员Mr Jones先生和Grumpy小姐。

      执行以下代码:

      INSERT INTO `coursedb`.`staff`
      (
        `staff_name`,
        `staff_surname`,
        `staff_title` 
      )
      SELECT 'James', 'Jones','Mr'
      UNION 
      SELECT 'Pot','Grumpy','Miss';
      

      这将插入两名工作人员。如果通过执行SELECT语句查看新插入的数据,您将找到以下数据:

       staff_ID staff_name  staff_surname  staff_title
       '1',     'James',    'Jones',       'Mr'
       '2',     'Pot',      'Grumpy',      'Miss'
      

      请注意数据库如何为这些员工分配ID号?这是工作人员的主要关键,我们使用它来识别人员表中的行。我暂时将其保留为自动数字,但这里有几个选项。

      我们现在需要创建这两位员工教授的课程。琼斯先生教数学和科学,格伦普小姐教艺术。让我们创建主题并将其链接到工作人员。这可以通过以下代码完成:

      INSERT INTO `coursedb`.`subject`
      (
          `subject_name`,
          `staff_ID`
      )
      VALUES
      (
          'Math',
           1
      );
      
      
      INSERT INTO `coursedb`.`subject`
      (
          `subject_name`,
          `staff_ID`
      )
      VALUES
      (
           'Science',
            1
      );
      
      
      INSERT INTO `coursedb`.`subject`
      (
          `subject_name`,
          `staff_ID`
      )
      VALUES
      (
        'Art',
         2
      );
      

      现在,您可以通过执行以下查询来查看琼斯先生所教授的科目:

      SELECT *
      FROM   staff stf
      INNER JOIN `subject` sub
            ON stf.staff_ID = sub.staff_ID
      WHERE stf.staff_ID =1;
      

      因此,在我们跟踪学生在课程中的表现之前,有两条信息缺失。结果的类型,即考试或考试,当然还有一些学生。所以让我们添加它们。

      INSERT INTO `coursedb`.`student`
      (
         `student_name`
      )
      VALUES
      (
          'Student 1'
      );
      
      
      INSERT INTO `coursedb`.`subject_result_type`
      (
        `subject_result_type_name`
      )
      SELECT 'Test'
      UNION 
      SELECT 'Exam'
      

      通过这种方式,我们可以为学生1记录一些结果。学生一次写了2门考试,一门是科学的,一门是数学,学生1也做过艺术考试。以下SQL将插入此数据:

       INSERT INTO `coursedb`.`subject_student_result`
       (`subject_ID`,
        `student_ID`,
        `subject_student_result_date`,
        `subject_student_result_score`,
        `subject_result_type_ID`
        )
        VALUES
        (
          1,
          1,
          CURDATE(),
          80,
          2
       );
      
       INSERT INTO `coursedb`.`subject_student_result`
       ( `subject_ID`,
         `student_ID`,
         `subject_student_result_date`,
         `subject_student_result_score`,
         `subject_result_type_ID`
       )
       VALUES
       (
          2,
          1,
          CURDATE(),
          60,
          2
       );
      INSERT INTO `coursedb`.`subject_student_result`
      (  `subject_ID`,
         `student_ID`,
         `subject_student_result_date`,
         `subject_student_result_score`,
         `subject_result_type_ID`
       )
       VALUES
       (
          3,
          1,
          CURDATE(),
          80,
          1
        );
      

      现在,您可以通过执行以下查询来绘制学生及其结果的报告:

       SELECT *
       FROM subject_student_result ssr
       INNER JOIN student std
             ON ssr.student_ID = std.student_ID
       INNER JOIN `subject` sub
             ON ssr.subject_ID = sub.subject_ID
       INNER JOIN subject_result_type srt
             ON ssr.subject_result_type_ID = srt.subject_result_type_ID
       INNER JOIN staff stf
             ON sub.staff_ID = stf.staff_ID
      

      我建议你通过这个模型,真正了解我向你展示的内容。它将使您的设计更简单,更清洁,更少维护。