MySQL 嵌套子查询中的变量
MySQL variables in nested subqueries
目前我正在开发一种包含课程和考试模块的电子学习平台。这个想法是课程之后是考试。用户可以解决几次考试(取决于考试 table 中的设置)。我有一个模块,我需要在其中确定是否应将用户重定向到考试或统计页面。如果用户没有使用他所有的尝试,他应该被重定向到考试,否则到统计。
这是我的查询(略微简化,因为外部查询的所有条件和连接在这里都不重要)应该确定去哪里。
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 版本相同。我想知道是否有某些设置阻止我的查询正确执行。另外我想知道你有什么建议,也许我的想法不好,我可以重建那个查询?
这可以工作。
交易与手册中的以下概念有关User-Defined Variables:
In the following statement, you
might think that MySQL will evaluate @a first and then do an
assignment second:
SELECT @a, @a:=@a+1, ...;
However, the order of evaluation for expressions involving user
variables is undefined.
并具有可变清洁功能。请参阅 Obligatory Reading 的 Baron 博客。考虑嵌套的 if 语句和 least()
、greatest()
和 coalesce()
的使用,以实现安全变量处理。
许多 mysql-variables
问题可能需要一些时间才能安全地编写。比如一个小时,或者半天。只得到一次正确的答案并不等同于生产就绪代码。不久前我创建了一个标签来放置它们,因为我偶然发现它们或写了一些。
目前我正在开发一种包含课程和考试模块的电子学习平台。这个想法是课程之后是考试。用户可以解决几次考试(取决于考试 table 中的设置)。我有一个模块,我需要在其中确定是否应将用户重定向到考试或统计页面。如果用户没有使用他所有的尝试,他应该被重定向到考试,否则到统计。
这是我的查询(略微简化,因为外部查询的所有条件和连接在这里都不重要)应该确定去哪里。
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 版本相同。我想知道是否有某些设置阻止我的查询正确执行。另外我想知道你有什么建议,也许我的想法不好,我可以重建那个查询?
这可以工作。
交易与手册中的以下概念有关User-Defined Variables:
In the following statement, you might think that MySQL will evaluate @a first and then do an assignment second:
SELECT @a, @a:=@a+1, ...;
However, the order of evaluation for expressions involving user variables is undefined.
并具有可变清洁功能。请参阅 Obligatory Reading 的 Baron 博客。考虑嵌套的 if 语句和 least()
、greatest()
和 coalesce()
的使用,以实现安全变量处理。
许多 mysql-variables
问题可能需要一些时间才能安全地编写。比如一个小时,或者半天。只得到一次正确的答案并不等同于生产就绪代码。不久前我创建了一个标签来放置它们,因为我偶然发现它们或写了一些。