MySQL - Komplizierter Query

Kalito

Erfahrenes Mitglied
Hallo,

ich muss für eine Punkteberechnung eine SQL-Abfrage schreiben. Jedoch scheitere ich irgendwie daran :(

Ich habe folgende Tabellen:

Code:
//training_typs

id | name | cjc
1    Typ1    0
2    Typ2    1
3    Typ3    1


Code:
//cjc_training

id | name          | angenommen | training_typ_id | punkte_user | punkte_leader
1    Schulung1     1                       1                        5                     5  
2    Schulung2     0                       2                        3                     1 
3    Schulung3     1                       2                        4                     4

Code:
//cjc_trainings_users

id | cjc_training_id | user_id
1    1                        2
2    2                        2     
3    3                        2

Code:
//cjc_trainings_leaders

id | cjc_training_id | user_id
1    1                        1
2    3                        2     
3    3                        3

Code:
//users

id | username | hatCjc
1    user1          1 
2    user2          0
3    user3          0


Ich brauche die Summe an Punkten, die ein Benutzer als Schulungsteilnehmer (cjc_trainings_users) und als Schulungsleiter (cjc_trainings_leaders) hat. Dabei sollen nur die Kombinationen betrachtet werden, bei denen die User betrachtet werden deren hatCjc = 0 ist, die Schulungen vom dem Training-Typ ist, dessen cjc=1 ist und bei dem CjcTraining.angenommen = 1 ist.
Als Ergebnis sollte folgende Tabelle rauskommen:
Code:
//Ergebniss-Tabelle

username | punkte
2                 8
3                 4


Bisher habe ich nur einzelne Abfragen hinbekommen, wie die Ermittlung der User, die Schulungen zugeordnet sind, die den oben genannten Kriterien erfüllen oder die Ermittlung der Punkte jeder Schulung wo angenommen = 1 und der Trainingtyp cjc = 1 hat.


Geht diese komplexe Abfrage überhaup in einer Abfrage?


Danke und Gruß,
Kalito
 
Hi,

prinzipiell geht erstmal alles. Es ist nur die Frage wie komplex es wird und ob man ab einer bestimmten Stelle nicht das Datenbankdesign überdenken sollte. Ich habe mal ein Query geschrieben, der dein Problem lösen könnte. Ich habe allerdings gerade kein System zur Hand um das zu testen.

Code:
SELECT users.id, SUM(users.punkte)  FROM (
	SELECT u.id, cjcu.cjc_training_id, cjcu.user_id, t.punkte_user as punkte
		FROM users as u
		JOIN cjc_trainings_users AS cjcu ON u.id = cjcu.user_id
		JOIN cjc_training as t ON u.cjc_training_id = t.id
		JOIN training_types as tt ON t.id = tt.id
	WHERE u.hatCjc = 0 AND tt.cjc = 1
	UNION
	SELECT u.id, cjcl.cjc_training_id, cjcu.user_id, t.punkte_leader as punkte
		FROM users as u
		JOIN cjc_trainings_leaders AS cjcl ON u.id = cjcu.user_id
		JOIN cjc_training as t ON u.cjc_training_id = t.id
		JOIN training_types as tt ON t.id = tt.id
		
	WHERE u.hatCjc = 0 AND tt.cjc = 1
	) as users
GROUP BY users.id
 
Ich habe es doch etwas anders gelöst, doch hänge ich in diesem Zuge an einem anderen Problem.
Code:
SELECT CT.id, CT.name, CT.datum, CT.dauer, CT.punkte_user, CT.punkte_leader
FROM cjc_trainings CT
Left JOIN cjc_trainings_users CTU ON CTU.cjc_training_id = CT.id 
Left JOIN cjc_trainings_leaders CTL ON CTL.cjc_training_id = CT.id 
WHERE CTU.user_id=1 OR CTL.user_id=1
ORDER BY datum ASC
Diese Funktion gibt mir alle Schulungen zurück, an der ein User als Teilnehmer oder Leiter eingetragen ist. Jedoch kann ich so nicht mehr unterscheiden, was er war. Ich brauche alle seine Schulungen nach Datum sortiert. Kann man irgendwie einen künstlichen Flag setzen oder die jeweilige Schulung den Punktestand Null setzen, der nicht betroffen ist?
 
SQL:
SELECT
    IF(ctu.user_id IS NULL, 'CTL', 'CTU') AS flag,
    ct.id,
    ...
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück