SQL-запрос для предметного предварительного условия

Извините, я задал еще один вопрос, потому что мой последний вопрос слишком сбивает с толку.

Обновлено: мой текущий ЗАПРОС

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

Я хочу, чтобы это произошло.

Студенческий_id = 1235 пытается зарегистрировать id_субъекта=5, поэтому этот оператор не должен выполняться, поскольку id_субъекта=5 имеет Предпосылку для id_субъекта=1 или программирование 1.

Но если, например, в student_subject sub_id 1 и Enrolled=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    |

Подумайте, что именно вы хотите получить. Вам нужны записи из student_subject, где student_id соответствует вашему студенту, а Enrolled равно 1, а subject_id равно pre_id из subject_bsit, где subject_id соответствует предмету, на который вы хотите записаться. Если у вас возникли проблемы с написанием SQL-запрос, то это обычно потому, что у вас нет четкого представления о том, что должен делать запрос, поэтому сначала поработайте над этим. Возьмите ручку и бумагу и напишите простым языком. Затем вы можете написать код для его постепенной реализации.

jmcilhinney 23.03.2019 05:29

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

Kimberypalet 23.03.2019 05:31

И удалите тот или иной ваш вопрос.

Strawberry 23.03.2019 08:45
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
3
185
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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.

Привет, это работает, если я пытаюсь добавить тему без предварительных условий. но я пытаюсь добавить идентификатор субъекта, у которого есть пререйсит, это ошибка. Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не работает (csais.student_subject, CONSTRAINT student_subject_ibfk_2 FOREIGN KEY (sub_id) REFERENCES subject_bsit (subject_id))

Kimberypalet 11.04.2019 06:45

@Kimberypalet Очень жаль, это была опечатка. Смотрите редактирование моего ответа. Если это работает для вас, пожалуйста, примите мой ответ, нажав на галочку (галочку) слева от ответа.

Mary 11.04.2019 18:01

Привет. Еще раз спасибо. Можешь еще раз помочь?? Я работаю над другой проблемой. Что, если проходной балл равен только 1,2 и 3, а 5 равен Failed, а также есть еще один «INC», означающий неполный, поэтому мне нужно установить проходной балл в виде строки, а функция Cint предназначена только для Integer?

Kimberypalet 12.04.2019 22:10

Я предлагаю вам принять мой ответ и задать новый вопрос.

Mary 12.04.2019 23:07

Извиняюсь. Большое спасибо.

Kimberypalet 12.04.2019 23:28

Другие вопросы по теме