СОЗДАЙТЕ несколько таблиц, перебирая ROWS в определенной таблице в MySQL.

Как я могу в MySQL использовать цикл по таблице Subject и создать таблицу для каждой темы, как показано ниже, используя Math, Econs, >химия в качестве примера. Добавляйте php только в крайнем случае.

Таблица: SUBJECTS

| Тема | единица | персонал |

| Математика | 3 | Мистер Джеймс |
| Эконом | 1 | Доктор Смит |
| Химия | 2 | Миссис Аиша |

таблица: MATHS

Студент | ТЕСТ1 | ТЕСТ2 | ЭКЗАМЕН |

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

таблица: ECONS

Студент | ТЕСТ1 | ТЕСТ2 | ЭКЗАМЕН |

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

таблица: CHEM

Студент | ТЕСТ1 | ТЕСТ2 | ЭКЗАМЕН |

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


person Nditah    schedule 14.01.2015    source источник
comment
Взгляните на LOOP. И CREATE в таблице на каждой итерации.   -  person Spencer Wieczorek    schedule 14.01.2015
comment
Пожалуйста, поделитесь тем, что вы пробовали.   -  person Jay Blanchard    schedule 14.01.2015
comment
Я уверен, что при создании таблицы для каждого субъекта требуется процедура для цикла, но я не знаю, как писать процедуры в MySQL.   -  person Nditah    schedule 14.01.2015
comment
Это не очень хороший дизайн базы данных. Серьезно, вы собираетесь создать кошмар обслуживания. Вам нужно прочитать этот ответ t sql, как динамически создавать таблицы в хранимых процедурах"> stackoverflow.com/questions/10877407/ Я призываю вас не создавать таблицы динамически.   -  person Namphibian    schedule 14.01.2015
comment
@Namphibian, спасибо всем, ребята, за вклад. Создание таблицы будет одноразовым. Мне нужна таблица для Marksheet для каждого из 500 курсов. Я работаю над этим. Я понимаю, что для этого мне нужно будет изучить процедуру MySQL Curso. Я бы хотел, чтобы профессионал пролил больше света в этом направлении.   -  person Nditah    schedule 20.01.2015
comment
@JayBlanchard, когда я придумаю что-то значимое, я это представлю. Спасибо, сэр.   -  person Nditah    schedule 20.01.2015
comment
@SamRans, дай мне минутку, и я покажу тебе, на что ты способен. Нет необходимости в таком количестве таблиц, поверьте мне.   -  person Namphibian    schedule 20.01.2015
comment
@SamRans goo, посмотри на мой довольно упрощенный дизайн и попробуй понять содержащиеся в нем концепции.   -  person Namphibian    schedule 20.01.2015


Ответы (1)


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

На основании этого мы можем выделить следующие сущности:

  1. Такие предметы, как математика, химия и т.
  2. Студенты, сдающие тесты и экзамены по этим предметам.
  3. Сотрудники, отвечающие за преподавание предметов и подготовку к экзаменам/тестам.
  4. Различные типы тестов, т. е. классный тест, экзамены и так далее.
  5. Результаты учащихся по тому или иному виду теста по конкретному предмету.

Итак, на основе этого (довольно упрощенного_ сценария) нам нужно всего 5 таблиц. Второе — определить отношения между сущностями. Давайте рассмотрим их.

  1. Предмет может быть представлен только одним сотрудником, но сотрудник может представлять несколько предметов. Например, математику преподает только мистер Джонс, но мистер Джонс преподает математику и естественные науки. Это то, что мы называем отношением один ко многим.
  2. У ученика может быть много результатов по многим предметам, а у одного предмета может быть много учеников со многими результатами. Например, Студент 1 сдал экзамен и тест по математике с двумя разными результатами. У математического предмета может быть 100 учеников, у каждого из которых записан один или несколько результатов. Это отношение многие ко многим.
  3. Каждый результат учащегося будет относиться к какому-либо типу экзамена или теста. Таким образом, здесь существует отношение один ко многим. Существует только один тип экзамена, но математика, естественные науки, география и история используют этот тип экзамена.

Итак, на основе всего этого создали небольшую демонстрационную базу данных. Я проведу вас через это.

Вот визуальное представление структуры: введите здесь описание изображения

Вот код базы данных.

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;

Давайте начнем добавлять некоторые данные, чтобы вы могли увидеть, как все это сочетается друг с другом. Сначала добавим двух сотрудников, мистера Джонса и мисс Ворчун.

Выполните следующий код:

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'

Заметили, как база данных присвоила этим сотрудникам идентификационные номера? Это первичный ключ для сотрудника, и мы используем его для идентификации строки в таблицах персонала. На данный момент я держу это для автоматических номеров, но здесь есть несколько вариантов.

Теперь нам нужно создать курсы, которые преподают эти два сотрудника. Мистер Джонс преподает математику и естественные науки, а мисс Грамп преподает искусство. Давайте создадим темы и свяжем их с сотрудниками. Это можно сделать с помощью следующего кода:

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. Студент 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

Я предлагаю вам проработать эту модель и действительно понять то, что я вам показываю. Это сделает ваши проекты проще и чище, а техническое обслуживание значительно сократится.

person Namphibian    schedule 19.01.2015
comment
спасибо вам вы огромная поддержка. Будучи новичком, я найду время, чтобы изучить и переварить ваш вклад. - person Nditah; 20.01.2015