#mysql #sql #database #vb.net #phpmyadmin
#mysql #sql #База данных #vb.net #phpmyadmin
Вопрос:
Извините, я задал еще один вопрос, потому что мой последний вопрос слишком запутанный.
РЕДАКТИРОВАТЬ: Мой текущий ЗАПРОС
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 и зарегистрировано = 1, что означает, что студент закончил программирование и уже зарегистрирован сейчас, студент = 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 |
Комментарии:
1. Подумайте о том, что именно вы хотите получить. Вам нужны записи из,
student_subject
гдеstudent_id
значение соответствует вашему студенту иEnrolled
равно 1, аsubject_id
равноpre_id
subject_bsit
гдеsubject_id
это значение для предмета, на который вы хотите записаться. Если у вас возникли проблемы с написанием SQL-запроса, то обычно это потому, что у вас нет четкого представления о том, что должен делать запрос, поэтому сначала разберитесь с этим. Возьмите ручку и бумагу и запишите простым языком. Затем вы можете написать код для его реализации шаг за шагом.2. Привет, у меня уже есть мой SQL запрос, но у меня возникла проблема из-за таблицы соединений и слишком большого количества подключений, я обновлю ее своим запросом.
3. И удалите один или другой из ваших вопросов.
Ответ №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
Комментарии:
1. Привет, это работает, если я только пытаюсь добавить subject без предварительного условия. но я пытаюсь добавить ИДЕНТИФИКАТОР subject, у которого есть предварительный запрос, это ошибка. Не удается добавить или обновить дочернюю строку: сбой ограничения внешнего ключа (
csais
.student_subject
, ССЫЛКИ наstudent_subject_ibfk_2
ВНЕШНИЙ КЛЮЧ (sub_id
)subject_bsit
(subject_id
) ОГРАНИЧЕНИЯ)2. Привет. Еще раз спасибо. Можете ли вы помочь мне еще раз?? Я сталкиваюсь с другой проблемой. Что, если проходной балл равен только 1,2, а 3 и 5 равны Failed, и есть также другой «INC», означающий неполный, поэтому мне нужно установить проходной балл в виде строки, но функция Cint предназначена только для целых чисел?
3. Извините. Большое вам спасибо.