Logischer Fehler in MySQL-Abfrage über mehrere Tabellen

ThoRr

Mitglied
Hi,

ich bewege mich mit Abfragen über mehrere Tabellen auf absolutem Neuland, aber ich kam jetzt nicht mehr wirklich umhin und praktisch ist es auch. Meine MySQL-Abfrage sieht folgendermaßen aus:
Code:
SELECT `classes`.`id`, `educators`.`edu_symbol`, `subjects`.`subj_symbol`, `colors`.`hex`
FROM `classes`, `educators`, `subjects`, `colors`
WHERE `classes`.`timetable_id`=4
AND `educators`.`id`=`classes`.`edu_id`
AND `subjects`.`id`=`classes`.`subj_id`
AND `colors`.`id`=`classes`.`color_id`

Allerdings ist das Ergebnis beim Holen der Datensätze false. Alle Tabellen in dieser Abfrage beinhalten einen Datensatz, der dem entsprechenden Feldwert der classes-Tabelle entspricht. Wo könnte ich ansetzen, hier den Fehler zu finden?

Edit: Ich habe mal die zweiten Argumente der Vergleiche (die Spalten der classes-Tabelle) durch die richtigen Zahlen ersetzt und bekomme jetzt die Fehlermeldung, dass ich einen Fehler in der MySQL-Syntax habe.

Vielleicht noch nützlich für die Fehlersuche: Ich möchte nachher in einem einzigen Array auf den Inhalt Felder zugreifen können, die ich unter SELECT angegeben habe.

Edit Nr.2: Nein, die direkte Angabe der Werte erzeugt doch keine Fehlermeldung. Es war nur tatsächlich ein Syntaxfehler drin, und zwar ein kleines Hochkommata ( `) zu viel. Die Angabe der Werte ändert nichts am Ergebnis.

LG
 
Zuletzt bearbeitet:
Okay, Thema erledigt - schlagt mich tot, der Datensatz, den ich manuell erstellt hatte, hatte die falsche timetable_id...
 
Nein, doch noch nicht ganz erledigt. Nun habe ich das Problem, dass direkt gar keine Daten geholt werden, wenn nur in einer Tabelle kein passender Datensatz vorhanden ist. Wenn z.B. für die Farb-ID, die auch mal 0 sein kann, wenn keine Farbe gewählt wurde, kein passender Datensatz in der Farbtabelle vorhanden ist, dann habe ich die restlichen Informationen auch nicht.

Lässt es sich irgendwie einrichten, dass dann nur diese eine Spalte (colors.hex) leer ist und nicht alle Spalten?
 
Danke für deine Antwort, allerdings ist UNION nicht exakt das, was ich suche. Im Prinzip ist es mir egal, ob eine Farbe für diese ID vorhanden ist, aber wenn sie es ist, dann möchte ich sie geliefert bekommen, ansonsten soll das Feld leer bleiben.

Ich habe es jetzt mal mit Subselects versucht, da der eine den anderen ja nicht beeinflussen dürfte, aber auch so bekomme ich keine Daten, wenn nur die Farbe fehlt.
SQL:
SELECT `classes`.`id`, `educators`.`edu_name`, `subjects`.`subj_name`, `rooms`.`room_symbol`, `colors_tbl`.`hex`
FROM `classes`, `educators`, `subjects`, `rooms`, (
	SELECT `colors`.`id`, `colors`.`hex`
	FROM `colors`, `classes`
	WHERE `colors`.`id`=`classes`.`color_id`
) AS `colors_tbl`
WHERE `educators`.`id`=`classes`.`edu_id`
AND `subjects`.`id`=`classes`.`subj_id`
 
Hi

Ich hoffe, ich hab dein Problem verstanden. Du versuchts über eine Relation Daten abzufragen, bei der du nicht sicher gehen kannst, dass am anderen Ende eine Entität vorhanden ist?!
Dann ist OUTER JOIN das was du suchst.
 
Super, vielen Dank. Das ist denke ich das, was ich brauche.

Ich hab mir mal die Syntax zu OUTER JOIN und ein paar Beispiele dazu angeschaut und daraufhin die Abfrage so gestaltet:
SQL:
SELECT `classes`.`id`, `educators`.`edu_name`, `subjects`.`subj_name`, `rooms`.`room_symbol`, `colors`.`hex`
FROM `classes` , `educators` , `subjects` , `rooms`
OUTER JOIN `colors` ON `colors`.`id`=`classes`.`color_id`
WHERE `educators`.`id`=`classes`.`edu_id`
AND `subjects`.`id`=`classes`.`subj_id`

Jedoch bekomme ich nun die Meldung, dass ich in Zeile 3 (die Zeile mit OUTER JOIN) habe, den ich aber einfach nicht erkenne. Ich habe die Abfrage zig Mal mit einem Beispiel verglichen und auch schon bis auf das Minimum gekürzt, aber selbst dann bleibt noch der Fehler.

Edit: Ah, ich habe einen interessanten Satz gefunden: "Achtung: MySQL unterstützt diese Abfrage nicht." Damit dürfte der Grund für das Problem gefunden sein. Da muss ich dann mal schauen, was ich alternativ verwenden könnte. Wenn ich nichts finde oder Probleme habe, oder wenn es funktionieren sollte (wovon ich jetzt mal so spontan nicht ausgehe), dann melde ich mich nochmal.
 
Zuletzt bearbeitet:
Mh, ich habe es jetzt mit RIGHT OUTER JOIN versucht, doch jetzt will MySQL angeblich die Spalte classes.color_id nicht finden, obwohl ich die classes-Tabelle unter FROM angegeben habe.

SQL:
SELECT `classes`.`id`, `educators`.`edu_name`, `subjects`.`subj_name`, `rooms`.`room_symbol`, `colors`.`hex`
FROM `classes` , `educators` , `subjects` , `rooms`
RIGHT OUTER JOIN `colors` ON `colors`.`id`=`classes`.`color_id`
WHERE `educators`.`id`=`classes`.`edu_id`
AND `subjects`.`id`=`classes`.`subj_id`
MySQL meldet daraufhin das:
Code:
#1054 - Unknown column 'classes.color_id' in 'on clause'
 
Mh, es wird immer komplizierter. Ich speichere jetzt die Lehrer-ID, Fach-ID und die Raum-ID in einer externen Tabelle, da ein Kurs aufgeteilt sein kann. Zur Anzeige eines Kurses brauche ich nur eine einzige dieser Differenzierungen, die ich mit einem Subselect holen wollte. Allerdings habe ich hier das Problem, das ich dafür die ID des Kurses aus dem übergeordneten Select brauche. Wie kann ich die im Subselect abrufbar machen?

SQL:
SELECT `classes`.`id`, `educators`.`edu_name`, `subjects`.`subj_name`, `rooms`.`room_symbol`, `colors`.`hex`
FROM `classes`, `educators`, `subjects`, `rooms`, (
	SELECT `edu_id`, `subj_id`, `room_id`
	FROM `differentiations`
	WHERE `class_id`=`classes`.`id`
	LIMIT 0,1
) AS `differentiation_sel`
OUTER JOIN `colors` ON `colors`.`id`=`classes`.`color_id`
WHERE `educators`.`id`=`differentation_sel`.`edu_id`
AND `subjects`.`id`=`differentiation_sel`.`subj_id`
AND `rooms`.`id`=`differentiation_sel`.`room_id`
 
Welche id willst du genau mit welcher id vergleichen?
Sorry, hab dein Text jetzt 5 mal gelesen und kappiers nicht. Schreib doch mal dein id-Problem mit genauer Tabellennamen und Feldname?

Woher hast du die info um welchen Kurs es sich handelt? Aus einer Variable in PHP oder aus einer Parametertabelle oder aus ?
 

Neue Beiträge

Zurück