Переменные MySQL во вложенных подзапросах

В настоящее время я работаю над платформой электронного обучения, которая содержит модуль курсов и экзаменов. Идея в том, что за курсом следует экзамен. Пользователь может выполнить экзамен несколько раз (в зависимости от настроек в таблице экзаменов). У меня есть модуль, в котором мне нужно определить, следует ли перенаправлять пользователя на страницу экзамена или статистики. Если пользователь не использовал все свои попытки, его следует перенаправить на экзамен, в противном случае — на статистику.

Итак, вот мой запрос (немного упрощенный, так как все условия и соединения внешнего запроса здесь не имеют значения), который должен определить, куда идти.

SELECT
@course_id := courses.id as id,
IF(
(SELECT X.attempts_count FROM
(SELECT
COUNT(exams_attempts.id) as attempts_count,
@max_attempts := exams.max_attempts
FROM exams
LEFT JOIN exams_attempts ON exams.id = exams_attempts.quiz_id
JOIN users ON exams_attempts.user_id = users.id
WHERE exams_attempts.user_id = 12
AND exams_attempts.course_id = @course_id
HAVING attempts_count >= @max_attempts) as X
),
'stats',
'exam'
) as redirect
FROM courses
WHERE courses.id = 1

По причинам тестирования я ограничил курсы статическим значением, но при реальном использовании это большое количество курсов для поиска.

И наконец — я обнаружил, что это работает на локальном хосте, но не на сервере, несмотря на ту же версию MySql. Я хотел бы знать, есть ли какая-либо настройка, которая препятствует правильному выполнению моего запроса. Также я хотел бы знать, что вы предлагаете, может быть, моя идея не очень хорошая, и я мог бы перестроить этот запрос?

0

Решение

Это можно заставить работать.

Сделка заключается в следующем понятии из руководства Пользовательские переменные:

В следующем заявлении вы
Можно подумать, что MySQL сначала оценит @a, а затем сделает
Назначение второе:

SELECT @a, @a:=@a+1, ...;

Тем не менее, порядок оценки для выражений с участием пользователя
переменные не определены.

И с переменной чисткой. Смотрите блог Барона, который Обязательное чтение. Рассмотрим вложенные операторы if и использование least(), greatest(), а также coalesce() это такие усилия для безопасной обработки переменных.

Многие из них mysql-variables вопросы могут занять некоторое время, чтобы написать безопасно. Как час или полдня. Простое получение правильного ответа не эквивалентно производственному готовому коду. Некоторое время назад я создал тег для размещения их, так как я перехожу в них или пишу несколько.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]