2017-11-18 2 views
1

// UPDATE: Die angegebene Antwort funktionierte, aber ich stieß auf eine andere Situation. Wenn ein Student an eine andere Position wechselt, muss er das Guthaben von der Beendigung der vorherigen Position behalten, wenn es eine Überschneidung gibt. Siehe folgende Situation:MySQL Erforderliche Klasse anzeigen Abgeschlossen

Ich habe 2 Kurse, Kurs A und Kurs B, die für jeden der beiden Trainingscodes benötigt werden. Wenn ein Schüler Kurs A und Kurs B unter Trainingscode 10 belegt und dann zu einer neuen Position (Trainingscode 30) wechselt, wird eine Ausnahme angezeigt, da CourseA und CourseB nicht abgeschlossen werden, weil sich ihr Code geändert hat. Obwohl der Kurs der gleiche ist. Ich habe versucht, die Anzahl der Beschreibung zu vergleichen, aber es funktioniert nicht. Der Name des Kurses ist activityId auf der Trainingstabelle sowie die erforderliche Trainingstabelle von oben. Irgendwelche Gedanken? Danke

Ich versuche, ein MySql-Skript zu schreiben, um zu bestimmen, wenn ein Schüler alle Klassen von einer Liste des erforderlichen Trainings (Curriculum) vervollständigt oder nicht abgeschlossen hat. Im folgenden Beispiel muss ich zeigen, dass John Doe die Klasse 1,2 und 3 für Training Level 0 abgeschlossen hat. Ich muss auch zeigen, dass Jane Does nicht alle Klassen abgeschlossen hat, da Klasse 2 fehlt. Ich habe versucht, den Klassen eine Bestellnummer zuzuordnen, also wenn Sie zu Bestellnummer 3 (Class3) kommen, sind Sie abgeschlossen, aber ich vermisse Lücken, wenn der Schüler Klasse 2 nicht angenommen hat. Auch dies muss 1500 Studenten durchlaufen zeige wer hat/hat nicht erfüllt Level 0 training.

tbltraining

firstname 
lastname 
email 
organization 
activity 
description 
status 
jobcode 

Ex tbltraining

John | Doe  | [email protected] | 1233 | Class1  | Certification | Completed | 030 
John | Doe  | [email protected] | 1233 | Class2  | Certification | Completed | 030 
John | Doe  | [email protected] | 1233 | Class3  | Certification | Completed | 030 
John | Doe  | [email protected] | 1233 | OtherClass | Certification | Completed | 030 
John | Doe  | [email protected] | 1233 | OtherClass2 | Certification | Completed | 030 
Jane | Doe  | [email protected] | 3311 | Class1  | Certification | Completed | 010 
Jane | Doe  | [email protected] | 3311 | Class3  | Certification | Completed | 010 
James | Doe  | [email protected] | 1233 | Class1  | Certification | Completed | 030 
James | Doe  | [email protected] | 1233 | Class2  | Certification | Incomplete | 030 

tblreqtraining

trainingname 
trainingdescription 
trainingcode 
traininglevel 

Ex tblreqtraining

Class1 | Certification | 30 | 0 
Class2 | Certification | 30 | 0 
Class3 | Certification | 30 | 0 
Class1 | Certification | 10 | 0 
Class2 | Certification | 10 | 0 
Class3 | Certification | 10 | 0 
Class4 | Certification | 10 | 0 
  • Activity Bedürfnisse trainingname
  • Description Bedürfnisse anzupassen trainingdescription
  • jobcode Bedürfnisse anzupassen anzupassen trainingcode

Abfrage:

SELECT tra.firstname, tra.lastname, tra.email, tra.organization, tra.activity, tra.description, 
     tra.jobcode, req.trainingname, req.traininglevel, req.trainingcode 
FROM tbltraining tra 
RIGHT JOIN tblreqtraining req on tra.activity = req.trainingname and right(tra.jobcode, 2) = req.trainingcode 
WHERE (right(tra.jobcode,2) = '30' or right(tra.jobcode,2) = '10') 
and tra.description = 'Certification' 
and tra.status = 'Completed' 
and req.traininglevel = 0 

Irgendwelche Gedanken oder Richtung auf diese würde geschätzt .

+0

Es ist unklar, wie die Ergebnisse aussehen würden. –

+0

Ich wäre in der Lage, eine Abfrage zu pullen, um eine Liste aller Schüler zu zeigen, die den Level 0-Lehrplan nicht abgeschlossen haben. Name, E-Mail, Jobcode, Organisation. Oder eine Liste derselben Spalten, die den Curriculum Level 0 abgeschlossen haben. – Jason

+0

Wenn Sie 'RIGHT JOIN' verwenden, sollten Sie keine Bedingungen für die linke Tabelle in der' WHERE'-Klausel haben, sie sollten in der 'ON'-Klausel stehen. Sonst wirst du alle 'NULL' Werte aus nicht übereinstimmenden Zeilen herausfiltern, und es ist wie' INNER JOIN'. – Barmar

Antwort

1

Erhalten Sie die Anzahl der Klassen für jeden Trainingscode und die Anzahl der Klassen, die jeder Schüler für jeden Trainingscode absolviert hat. Wenn die Anzahl der Schüler nicht der Anzahl der Schüler entspricht, haben sie nicht alle Klassen abgeschlossen.

SELECT tra.firstname, tra.lastname, tra.trainingcode, 
     CASE IFNULL(tra.completed_count, 0) 
      WHEN req.class_count THEN 'Completed All' 
      ELSE 'Not completed' 
     END 
FROM (
    SELECT trainingcode, COUNT(*) class_count 
    FROM tblreqtraining 
    WHERE traininglevel = 0 
    GROUP BY trainingcode 
) AS req 
LEFT JOIN (
    SELECT firstname, lastname, RIGHT(jobcode, 2) AS trainingcode, COUNT(*) AS completed_count 
    FROM tbltraining AS tra 
    JOIN tblreqtraining AS req ON RIGHT(tra.jobcode, 2) = req.trainingcode AND tra.activity = req.trainingname 
    WHERE tra.description = 'Certification' AND tra.status = 'Completed' 
    AND req.traininglevel = 0 
    GROUP BY firstname, lastname, trainingcode 
) AS tra ON tra.trainingcode = req.trainingcode 
+0

Ja, das fängt an zu arbeiten!Aber im LEFT JOIN mit dem tbltraining werden alle abgeschlossenen Zertifizierungen gezählt, inklusive Zertifizierungen, die nicht im Level 0 Curriculum enthalten sind. Ich versuche, der WHERE-Anweisung im LINKEN JOIN folgendes hinzuzufügen: WHERE description = 'Certification' UND status = 'Completed' und activity in (SELECT trainingsname FROM tblreqtraining WHERE traininglevel = 0) nur zu zählen die Anzahl der abgeschlossenen Kurse mit dem Namen in tblreqtraining. Denken Sie auch, ich brauche irgendwo ein DISTINCT, während die Schüler den Kurs mehr als einen absolvieren. – Jason

+0

Fügen Sie einfach 'AND traininglevel = 0' zur 'tbltraining'-Unterabfrage hinzu. – Barmar

+0

Ich habe eine Verknüpfung zur zweiten Unterabfrage hinzugefügt, so dass nur Klassen gezählt werden, die sich in 'tblreqtraining' befinden. – Barmar

Verwandte Themen