Круглый отбор Робина в php? - PullRequest
0 голосов
/ 20 мая 2018

У меня есть таблицы ниже

class_student_mapping

class_id    student_id
    1   1
    1   2
    1   3
    1   4
    2   1
    2   2


student_program_mapping
 student_id     class_id    program_id
    1               1         1
    2               1         1

Мне нужно назначить программы для учащихся по классам

Я получу идентификатор класса и идентификатор программы, чем мне нужночтобы проверить последнего назначенного студента в student_program_mapping после получения этого студента, я назначу нового студента из таблицы class_student_mapping, у которого student_id больше, чем последний назначенный студент

Для этого я использую ниже sql

SELECT MAX( `student_id` ) as last_assigned_student
FROM `student_program_mapping`
WHERE `class_id` =1
AND `program_id` =1

Что дает мне результат = 2 Теперь я нашел в таблице class_student_mapping идентификатор студента, который просто больше, чем 2

SELECT `student_id`
FROM `class_student_mapping`
WHERE `student_id` > (
SELECT MAX( `student_id` ) AS last_assigned_student
FROM `student_program_mapping`
WHERE `class_id` =1
AND `program_id` =1 ) order by student_id  limit 1

Я даю мне идентификатор студента как 3, который является моим желаемым результатом

Но яесть проблема, если я должен сделать это для класса с идентификатором 2, который не имеет никакого сопоставления студенческой программы в таблице сопоставления студенческой программы, чем как получить идентификатор студента в этом случае.

Пожалуйста, помогите мне

Как и в случае с классом 2. Мне нужно впервые добавить студента в таблицу student_program_mapping, поэтому мне требуется самый низкий идентификатор студента, но с этим запросом я не получаю его первымвремя

1 Ответ

0 голосов
/ 20 мая 2018

Ваша проблема в том, что подзапрос возвращает NULL, поскольку в student_program_mapping нет записей для class_id=2, и любое сравнение с NULL возвращает false.Чтобы исправить это, оберните MAX(student_id) в IFNULL, чтобы он возвращал 0 для этого случая:

SELECT `student_id`
FROM `class_student_mapping`
WHERE `student_id` > (
SELECT IFNULL(MAX( `student_id` ), 0) AS last_assigned_student
FROM `student_program_mapping`
WHERE `class_id` =2
AND `program_id` =1 ) order by student_id  limit 1

Вывод ( SQLFiddle ):

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