2016-08-10 3 views
0

Derzeit arbeite ich auf Art von E-Learning-Plattform, die Kurse und Prüfungen Modul enthalten. Die Idee ist, dass der Kurs von einer Prüfung gefolgt wird. Der Benutzer kann die Untersuchung einige Male lösen (abhängig von der Einstellung in der Untersuchungstabelle). Ich habe ein Modul, in dem ich feststellen muss, ob der Benutzer zur Prüfungs- oder Statistikseite weitergeleitet werden sollte. Wenn der Benutzer nicht alle seine Versuche benutzt hat, sollte er zur Prüfung weitergeleitet werden, ansonsten zu den Statistiken.MySQL-Variablen in verschachtelten Unterabfragen

Also hier ist meine Abfrage (wenig vereinfacht, da alle Bedingungen und Joins der äußeren Abfrage hier keine Rolle spielt), die bestimmen sollte, wohin zu gehen.

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 

Zum Testen Gründen begrenzt I-Kurse auf einen statischen Wert, aber in der tatsächlichen Nutzung zu sehen, es ist große Menge an Kursen.

Und schließlich - ich entdeckte, dass dies auf localhost funktioniert, aber nicht auf dem Server, trotz der gleichen MySql-Version. Ich würde gerne wissen, ob es eine Einstellung gibt, die verhindert, dass meine Anfrage korrekt ausgeführt wird. Ich würde auch gerne wissen, was Sie vorschlagen, vielleicht ist meine Idee nicht gut und ich könnte diese Abfrage neu erstellen?

Antwort

2

Dies kann gemacht werden, um zu arbeiten.

Der Deal ist mit folgendem Konzept aus dem Handbuch User-Defined Variables:

In der folgenden Anweisung Sie könnte denken, dass MySQL zweite @a ersten und führen Sie dann eine Zuordnung auswertet:

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

Die Reihenfolge der Auswertung für Ausdrücke, die Benutzer Variablen betreffen, ist jedoch undefiniert.

Und mit variabler Reinigung. Siehe den Blog von Baron, der Obligatory Reading ist. Betrachten Sie verschachtelte if-Anweisungen und die Verwendung von least(), greatest() und coalesce() es solche Bemühungen für eine sichere Handhabung der Variablen.

Viele dieser mysql-variables Fragen können einige Zeit dauern, um sicher zu schreiben. Wie eine Stunde oder einen halben Tag. Nur einmal die richtige Antwort zu erhalten, entspricht nicht dem Production Ready-Code. Ich habe vor einer Weile ein Etikett erstellt, um sie zu beherbergen, während ich mich in sie vertiefe oder ein paar schreibe.

+0

Dieser Artikel half mir tatsächlich, Variablen zu verstehen und mein Problem zu lösen. Ich empfehle es für alle, die mit etwas fortgeschrittener SQL arbeiten. – Rocket