【问题标题】:How to create Student Subject with prerequisite Database如何使用必备数据库创建学生主题
【发布时间】:2019-03-22 21:01:06
【问题描述】:

我正在尝试为主题先决条件创建一个数据库,这是我当前的表。

“学生”

-----------------------
|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_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的前提。

我不知道我的表格是否正确。如果它是正确的,我该如何设计该数据库,我不知道如何将先决条件与主题和学生 ID 联系起来,非常感谢。

【问题讨论】:

  • 你的数据结构没问题。您只需要根据手头的确切任务进行正确的 JOIN。
  • 您的数据结构看起来不错。您唯一需要做的就是在将记录添加到 student_subject 表之前,您需要检查是否存在先决科目的条目(如果适用)
  • @rohitshetty 如果用户 b 插入该行 用户 a 正在检查会发生什么

标签: mysql sql database vb.net phpmyadmin


【解决方案1】:

首先您需要使用以下代码(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 existstricky conditional insert 进行操作:

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

【讨论】:

  • 您好,我在帖子中更新了我的数据库。如果用户尝试注册 subjectid=5 编程 2 并且 subjectid=1 编程 1 仍然没有注册。但是如果在 subjectid=1 上注册 = 1,则用户可以注册主题编程 2。我是否需要使用 if 语句来获取我想要的语句,非常感谢。我不知道我的问题是否令人困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-29
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
相关资源
最近更新 更多