嵌套子查询中的MySQL变量

时间:2016-08-10 05:13:32

标签: php mysql mysql-variables

目前我正在开发一种包含课程和考试模块的电子学习平台。这个想法是课程之后是考试。用户可以解决几次考试(取决于考试表中的设置)。我有一个模块,我需要确定是否应将用户重定向到考试或统计页面。如果用户没有使用他的所有尝试,他应该被重定向到考试,否则被重定向到统计数据。

所以这是我的查询(稍微简化,因为外部查询的所有条件和连接在这里都不重要),这应该决定去哪里。

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

出于测试原因,我将课程限制为静态值,但在实际使用中,需要查看大量课程。

最后 - 我发现这适用于localhost,但不适用于服务器,尽管MySql版本相同。我想知道是否有一些设置阻止我的查询正确执行。另外我想知道你的建议是什么,也许我的想法不好,我可以重建那个查询?

1 个答案:

答案 0 :(得分:2)

这可以起作用。

该交易采用手册User-Defined Variables中的以下概念:

  

在以下声明中,您   可能会认为MySQL会首先评估@a然后做一个   第二个任务:

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

但是,涉及用户的表达式的评估顺序   变量未定义。

并且可变清洁。请参阅Baron的博客Obligatory Reading。考虑嵌套的if语句以及使用least()greatest()coalesce()这样的安全变量处理工作。

这些mysql-variables个问题中的许多问题可能需要一些时间来安全地编写。像一个小时,或半天。只是得到一次正确答案并不等同于生产就绪代码。我不久前创建了一个标签来容纳它们,因为我重新插入它们或写了一些。