2016-08-10 3 views
0

現在、私はコースと試験モジュールを含むeラーニングプラットフォームの種類に取り組んでいます。アイデアは、コースの後に試験が続くということです。ユーザーは試験を数回解決することができます(試験表の設定に応じて)。私は、ユーザーが試験ページまたは統計ページにリダイレクトする必要があるかどうかを判断するためのモジュールを用意しています。ユーザーがすべての試行を使用していない場合は、試験にリダイレクトするか、そうでない場合は統計にリダイレクトする必要があります。ネストされたサブクエリの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バージョンにもかかわらず、ローカルホストでは動作しますが、サーバでは動作しないことを発見しました。私は、クエリが正しく実行されないような設定があるかどうかを知りたいと思います。また、私はあなたの提案が何であるかを知りたいと思っています。私の考えは良くなく、そのクエリを再構築できますか?

答えて

2

これは動作させることができます。

取引は手動User-Defined Variablesから、次の概念である:次のステートメントでは

、あなたは は、MySQLは@a最初を評価した後、第2 割り当てを行いますことを考えるかもしれない:

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

ただし、ユーザー 変数を含む式の評価順序は未定義です。

そして、可変的な洗浄があります。 BaronのブログObligatory Readingを参照してください。ネストされたifステートメントと、least(),greatest()、およびcoalesce()を使用して、安全な変数処理のためのこのような努力を考慮してください。

これらの質問の多くは、安全に書き込むにはしばらく時間がかかることがあります。 1時間、半日のように。一度だけ答えを得ることは、プロダクション対応のコードと同じではありません。しばらく前にタグを作って、私がそれらの中に再構成したり、いくつかのものを書いたりして、それらを収容する。

+0

この記事は実際に変数を理解して問題を解決するのに役立ちました。もう少し高度なSQLを扱う皆さんにお勧めします。 – Rocket

関連する問題