2016-08-10 3 views
0

현재 코스 및 시험 모듈을 포함하는 전자 학습 플랫폼의 일종을 연구 중입니다. 아이디어는 코스가 시험에 이어지는 것입니다. 사용자는 시험 테이블의 설정에 따라 시험을 몇 번이나 풀 수 있습니다. 나는 사용자가 시험 또는 통계 페이지로 리디렉션되어야하는지 여부를 결정해야하는 모듈을 가지고 있습니다. 사용자가 모든 시도를 사용하지 않은 경우 시험으로 리디렉션되어야하며, 그렇지 않으면 통계로 리디렉션되어야합니다.중첩 된 서브 쿼리의 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 버전 임에도 불구하고 localhost에서는 작동하지만 서버에서는 작동하지 않음을 발견했습니다. 내 쿼리가 제대로 실행되지 못하게하는 몇 가지 설정이 있는지 알고 싶습니다. 또한 나는 당신이 무엇을 제안하는지 알고 싶습니다. 아마 제 아이디어가 좋지 않고 그 쿼리를 다시 만들 수 있습니까?

답변

2

이것은 작동하도록 만들 수 있습니다.

거래는 수동 User-Defined Variables에서 다음과 같은 개념이다 : 다음 문장에서

, 당신 은 MySQL이 @a 첫째을 평가 것이라고 생각하고 두 번째 과제를 수행

SELECT @a, @a:[email protected]+1, ...; 

그러나 사용자 변수가 포함 된 표현식에 대한 평가 순서는 정의되지 않습니다.

가변 클렌징. Baron의 블로그 Obligatory Reading을 참조하십시오. 중첩 된 if 문과 least(), greatest()coalesce()의 안전한 변수 처리를위한 노력을 고려하십시오.

이러한 mysql-variables 개의 질문 중 많은 부분이 안전하게 작성하는 데 다소 시간이 걸릴 수 있습니다. 한 시간이나 반나절 같이. 한 번 정확하게 대답을 얻는 것은 프로덕션 준비 코드와 동일하지 않습니다. 얼마 전 태그를 만들었습니다. 다시 태그를 달거나 몇 개를 적어 두었습니다.

+0

이 기사는 실제로 변수를 이해하고 내 문제를 해결하는 데 도움이되었습니다. 좀 더 진보 된 SQL을 사용하는 모든 사람들을 위해 추천합니다. – Rocket