【问题标题】:SQL Query for subject prerequisite主题先决条件的 SQL 查询
【发布时间】:2019-03-23 04:21:19
【问题描述】:

对不起,我提出了另一个问题,因为我的最后一个问题太混乱了。

编辑:我当前的查询

UPDATE student_subject 
  JOIN subject_bsit
    ON subject_bsit.subject_id = student_subject.sub_id
   SET enrolled = 1 
 where student_subject.student_id = 1235 
   and student_subject.sub_id = 1

我想要发生的是。

Student_id=1235 正在尝试注册 subject_id=5,因此该声明不能发生,因为 subject_id=5 具有 的先决条件>subject_id=1 或编程 1

但如果 student_subject 中的示例 sub_id 为 1 且 Enrolled=1 表示学生完成编程并且现在已经注册,那么 student=1235 现在可以注册 subjectid=5

我不知道如何进行此查询。非常感谢。

THIS IS THE TABLE

    "student"

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

"subject_bsit"

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

This is the Junction table to connect the 
    two now.

"student_subject"

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

【问题讨论】:

  • 想想你想要得到什么。您想要来自student_subject 的记录,其中student_id 与您的学生匹配,Enrolled 为1,subject_id 等于subject_bsitpre_id,其中subject_id 是主题你想注册。如果你在编写 SQL 查询时遇到问题,那通常是因为你不清楚查询必须做什么,所以先解决这个问题。拿起笔和纸,用简单的语言写下来。然后你可以编写代码来一点一点地实现它。
  • 嗨,我已经有了我的 SQL 查询,但是由于联结表和太多的连接我遇到了问题,我会用我的查询更新它。
  • 并删除您的一个或其他问题。

标签: mysql sql database vb.net phpmyadmin


【解决方案1】:

行内评论。

Private conString As String = "Your connection string"

Private Sub EnrollStudent(StudentID As Integer, SubjectID As Integer)
    'Question Does Subject have a prerequisite?
    Dim Prerequisite As Integer
    Using cn As New MySqlConnection(conString)
        Using cmd As New MySqlCommand("Select pre_id from subject_bsit 
                                        where subject_id = @subject_id", cn)
            cmd.Parameters.Add("@subject_id", MySqlDbType.Int32).Value = SubjectID
            cn.Open()
            Prerequisite = CInt(cmd.ExecuteScalar)
        End Using
    End Using
    'Answer - No, It is OK to enroll student there are no prerequisites
    If Prerequisite = 0 Then
        InsertEnrollment(StudentID, SubjectID)
        Return
    End If
    'Answer - Yes there Is a prerequisite
    'New Question - Has the student passed the prerequisite?
    Dim PassingGrade As Integer
    Using cn As New MySqlConnection(conString)
        Using cmd As New MySqlCommand("Select Grade From student_subject 
                                        Where subject_id = @subject_id 
                                        And student_id = @student_id", cn)
            cmd.Parameters.Add("@subject_id", MySqlDbType.Int32).Value = Prerequisite
            cmd.Parameters.Add("@student_id", MySqlDbType.Int32).Value = StudentID
            cn.Open()
            PassingGrade = CInt(cmd.ExecuteScalar)
        End Using
    End Using
    'Answer - Yes, student has a passing grade.
    If PassingGrade > 0 Then
        InsertEnrollment(StudentID, StudentID)
    Else 'Answer - No, student does not have a passing grade in prerequisite.
        MessageBox.Show("Student cannot enroll because of prerequisite.")
    End If
End Sub

Private Sub InsertEnrollment(StudentID As Integer, SubjectID As Integer)
    Dim query = "Insert Into student_subject (student_id, subjectId, Grade, Enrolled) 
                Values (@student_id, @subject_id, 0, 1);"
    Using cn As New MySqlConnection(conString)
        Using cmd As New MySqlCommand(query, cn)
            cmd.Parameters.Add("@student_id", MySqlDbType.Int32).Value = StudentID
            cmd.Parameters.Add("@subject_id", MySqlDbType.Int32).Value = SubjectID
            cn.Open()
            cmd.ExecuteNonQuery()
        End Using
    End Using
    MessageBox.Show("Successful enrollment")
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    EnrollStudent(1235, 5)
End Sub

编辑

这里有错别字...

If PassingGrade > 0 Then
    InsertEnrollment(StudentID, StudentID)

这应该是

If PassingGrade > 0 Then
    InsertEnrollment(StudentID, SubjectID)

第二个参数是SubjectID

【讨论】:

  • 嗨,如果我只尝试添加一个没有先决条件的主题,它就可以工作。但我尝试添加具有 prereisite 的主题 ID,这是错误。无法添加或更新子行:外键约束失败 (csais.student_subject, CONSTRAINT student_subject_ibfk_2 FOREIGN KEY (sub_id) REFERENCES subject_bsit (subject_id))
  • @Kimberypalet 非常抱歉,这是一个错字。请参阅我的答案的编辑。如果这对您有用,请点击答案左侧的复选标记(勾号)接受我的回答。
  • 嗨。再次感谢你。你能再帮我一次吗??我遇到了另一个问题。如果及格分数只有 1,2 和 3 和 5 等于 Failed 并且还有另一个“INC”表示不完整,所以我需要将及格分数设置为字符串但 Cint 函数仅适用于整数?
  • 我建议你接受我的回答并提出一个新问题。
  • 对不起。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-23
  • 2011-07-10
  • 1970-01-01
  • 1970-01-01
  • 2012-02-29
  • 2011-04-14
  • 1970-01-01
相关资源
最近更新 更多