2010-12-30 6 views
0

Ich habe ein System, wo ein Benutzer Teil einer Reihe von "Läufen" ist, zu jedem "Lauf", können Kurse, Lehrer (Benutzer), Klassen und so hinzugefügt werden auf.Problem mit dem Abrufen bestimmter Daten basierend auf mehreren Faktoren in MySQL

Jeder Lehrer (Benutzer) hat seine Klassen & Kurse ausgewählt. Hier ist ein heruntergekommenes der Tabellen I, die relevant sind:

lam_run - The run in it self. 
lam_run_course - Relational table that shows what runs has what courses 
lam_teacher_course - Relational table that shows which teacher has which courses 
lam_run_teacher - Relational table that shows what teachers are in what courses 

Was ich will ist zu tun, um jeden Lehrer zeigen, die die für sie relevant sind läuft (basierend auf welche Kurse sie ausgewählt haben, in lam_teacher_course gesehen) aber an denen sie nicht schon teilnehmen.

Hier ist der MySQL-Code, den ich bisher habe, das nicht funktioniert:

$query_relevant_runs = " 
SELECT DISTINCT 
    lam_run_course.run_id 
FROM 
    lam_teacher_course, 
    lam_run_course, 
    lam_run, lam_run_teacher 
WHERE 
    lam_teacher_course.user_id = '1' 
AND 
    lam_teacher_course.course_id = lam_run_course.course_id 
AND 
    lam_run_teacher.user_id != '1'"; 

Statt dieser Code alle Läufe zeigt, die relevant sind, aber es schließt nicht die Läufe der Benutzer ist bereits ..

Was kann ich tun, um das Problem zu beheben?

Ps. Sorry für schlechte Titel, keine Ahnung, was ich soll es genannt habe: S

Hier ist ein Link zu einem Teil der Datenbanken ist (der relevante Teil): Link!

+0

I kann nicht helfen zu denken, dass etwas mit der JOIN falsch ist ... "lam_teacher_course.course_id = lam_run_course.course_id" aber da wir die Tabelle nicht haben ist wirklich schwer zu sagen, was es ist .. –

+0

Würde es helfen, wenn Ich habe einen DB-Dump von phpmyadmin der relevanten Tabellen hinzugefügt? :) – Eax

+0

Probieren Sie es aus - zumindest können wir versuchen, es zu debuggen. Es sieht so aus, als ob die Abfrage gut ist ... Ich sehe keine Syntaxfehler, also muss es die Logik sein. –

Antwort

1

Ich denke, was Sie ist gesuchte:

LEFT JOIN `lam_run_teacher` `lam_run_teach_exclude` 
ON `lam_run_teacher_exclude`.`user_id` = `lam_teacher_user`.`user_id` 
... 
WHERE `lam_run_teacher`.`user_id` IS NULL 

Der LINKE JOIN nimmt Ihre aktuelle Abfrage und hängt die zusätzlichen Daten an sie an. Anders als der INNER JOIN, den Sie jetzt benutzen (mit der etwas seltsamen Multiple-from-Syntax), beschränkt der LEFT JOIN Ihre Ergebnismenge nicht auf diejenigen, bei denen Daten für die rechte Seite vorhanden sind. Die rechten Spalten sind NULL. Durch das Filtern nach NULL können Sie alle Läufe finden, die interessant sind und für die noch keine Beziehung zum Lehrer besteht.

Hilft das?

Ich würde empfehlen, immer die normale Joinsyntax zu verwenden (INNER JOIN target on target.id = source.id) - auf diese Weise sind Sie sich der Idee bewusst, dass es auch andere Arten von Joins gibt, und alle Ihre Joins werden identisch aussehen. Es ist etwas gewöhnungsbedürftig, hilft aber definitiv, wenn Ihre Abfragen komplexer werden.

Außerdem können Sie in Ihren Querverweistabellen die Primärschlüsselspalten löschen. Wenn der einzige Zweck einer Tabelle darin besteht, eine Verknüpfung zwischen zwei Tabellen zu definieren, besteht der Primärschlüssel aus den zwei Schlüsseln, die Sie haben. Es sei denn, Sie die gleichen Lehrer im Zusammenhang mit einem Lauf mehrmals in der Lage sein wollen ...


OK, nahm mich viel länger als es haben sollte, aber hier ist die komplette Sache:

 
SELECT 
    DISTINCT `lam_run_course`.run_id 
FROM 
    `lam_run_course` 
INNER JOIN 
    `lam_teacher_course` 
    ON `lam_teacher_course`.course_id = `lam_teacher_course`.course_id 
LEFT JOIN 
    `lam_run_teacher` ON (`lam_run_teacher`.`run_id` = `lam_run_course`.`run_id` AND `lam_run_teacher`.`user_id` = 3) 
WHERE 
    `lam_teacher_course`.user_id = 3 
    and `lam_run_teacher`.`run_id` IS NULL 
+0

Eigentlich nein, ich verstehe das nicht wirklich: S Es scheint nicht so, als ob es meine aktuelle Abfrage braucht? Und was ist lam_run_teach_exclude? – Eax

+0

Hallo Eax - Entschuldigung. lam_run_teacher_exclude ist ein Alias. Da wir uns zweimal mit der Tabelle verbinden, müssen Sie einen der beiden Joins aliasieren, sonst weiß MySQL nicht, für welche Tabelle diese Bedingung gültig ist. Ich werde meine Antwort aktualisieren, um Ihre ganze Abfrage statt nur die Schnipsel einzufügen, geben Sie mir ein paar Momente :) – kander

+0

Danke! :) Ich lerne viel besser durch Beispiel als eine Erklärung bekommen :) – Eax

Verwandte Themen