Как создать тему для ученика с необходимой базой данных - PullRequest
0 голосов
/ 23 марта 2019

Я пытаюсь создать базу данных для предметного условия. Это моя текущая таблица.

"студент"

-----------------------
|studentID | FullName |
-----------------------
|1234      | John    |
|1235      | Michael |
|1236      | Bryce   |

"subject_bsit"

-----------------------------------------
|subject_id| subject_name  |  pre_id    |
-----------------------------------------
|    1     | Programming 1 |    NULL     |
|    2     | Networking    |    NULL     |
|    3     | Algorithm     |    NULL     |
|    4     | Physical Educ |    NULL     |
|    5     | Programming 2 |     1       |

Это таблица соединений для подключения два сейчас.

"student_subject"

------------------------------------------------
| student_id | subject_id | Grade   | Enrolled |
------------------------------------------------
|   1235     |      1     |    0    |     0    |
|   1235     |      2     |    0    |     0    |
|   1235     |      3     |    0    |     0    |
|   1234     |      1     |    0    |     0    |

Пример, если studentID 1235 все еще не принимает subject_id 1 , который программирует 1, пользователь не может добавить subject_id 5 , который программирует 2, потому что он является предпосылкой программирования 1.

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

1 Ответ

0 голосов
/ 23 марта 2019

Сначала необходимо найти все предпосылки (родители) указанного субъекта рекурсивно с помощью следующего кода (MySQL 8+):

set @newSubjectToAdd = 5;

with recursive cte (subject_id,subject_name,pre_id) as
(
  Select subject_id,subject_name,pre_id
  from subject_bsit
  where subject_id = @newSubjectToAdd 
  union all

  Select sb.subject_id,sb.subject_name,sb.pre_id
  from subject_bsit sb
  inner join cte 
  on  sb.subject_id = cte.pre_id
)

Select pre_id from cte
where pre_id is not null
order by subject_id

( Demo1 )

Затем, проверив, имеет ли студент все предметы, полученные из предыдущего запроса, вы можете решить, разрешить ли пользователю назначать предмет студенту или нет.

Обновление:

Если следующий запрос не существует, вы можете добавить тему к студенту. Вы можете сделать это либо if exists, либо хитрой условной вставкой :

Select pre_id from cte
where pre_id is not null
and pre_id not in 
(select subject_id from student_subject
where student_id = 1235
and enrolled = 1)

Demo2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...