Logischer Fehler in MySQL-Abfrage über mehrere Tabellen

Ich hab mir schon gedacht, dass es ein wenig schwierig wird, die Abhängigkeiten der Tabellen nachzuvollziehen. Ich wollte meinen Beitrag zwar nicht durch Tabellenschemata in die Länge ziehen, aber ich denke, dass ist die beste Lösung.

In der Tabelle educators werden die Lehrpersonen gespeichert - noch nichts Wildes.
Code:
id: int(11), auto_increment.
edu_symbol: varchar(4).
edu_name: varchar(255).


In der Tabelle subjects werden die Fächer gespeichert - das Gleiche wie bei den Lehrern.
Code:
id: int(11), auto_increment.
subj_symbol: varchar(5).
subj_name: varchar(255).


In der Tabelle rooms werden die Räume gespeichert.
Code:
id: int(11), auto_increment.
room_symbol: varchar(10).
room_name: varchar(255).

In der Tabelle colors werden Farben gespeichert, um später schneller auf sie zurückgreifen zu können.
Code:
id: int(11), auto_increment.
hex: varchar(6).


In der Tabelle classes werden die Kurse gespeicher. Es ist eine Farbe möglich, aber nur möglich - ist sie nicht gesetzt, dann ist die Zahl 0, die aber kein entsprechenden Datensatz in der colors-Tabelle besitzt. Die Spalte is_diff (0 oder 1), sagt aus, ob es sich bei dem Kurs um eine Teilung der Stufe handelt, um diesen Umstand später direkt in der Tabelle markieren zu können. Die timetable_id ordnet den Kurs nur dem Stundenplan zu, da es mehrere gibt, die ist aber eher unwichtig.
Code:
id: int(11), auto_increment.
timetable_id: int(11).
is_diff: int(1).
color_id: int(11).


In der Tabelle differentiations werden nun Lehrer, Fach und Raum einem Kurs zugeordnet. Dabei kann es bei Teilung der Stufe (Differenzierung) mehrere Datensätze mit der gleichen Kurs-ID geben. Allerdings soll davon für die obige Abfrage nur einer genommen werden - welcher, ist egal.
Code:
id: int(11), auto_increment.
class_id: int(11).
edu_id: int(11), Default 0.
subj_id: int(11).
room_id: int(11), Default 0.


In der Tabelle lessons werden die Kurse letztendlich den Zeiten zugeordnet, aber auch eher irrelevant bzw. diese Abhängigkeit stellt kein weiteres Problem dar.
Code:
id: int(11), auto_increment.
timetable_id: int(11).
les_wday: int(1).
les_time: int(2).
class_id: int(11).



Mein Problem bei der Abfrage oben ist, dass ich im Subselect nicht auf eine Spalte des aktuellen Datensatzes im übergeordneten Select zugreifen kann - zumindest weiß ich nicht, wie. Allerdings muss ich dies, da ich im Subselect ja eine Differenzierung wählen möchte, die die ID des gerade behandelten Kurses trägt. Ich bin auch die Möglichkeit mit Join anstelle eines Subselects durchgegangen, doch dort stehe ich vor dem Problem, dass ich dort einerseits die Ergebnisse nicht sortieren und andererseits nicht auf 1 limitieren kann. Mit den Outere Join lese ich die Farbe aus, wenn sie vorhanden ist.
 
Zuletzt bearbeitet:
Ich kann mir vorstellen, dass niemand Lust hat, sich da reinzudenken. Ich muss auch eigentlich nur wissen, wie man in Subselects auf eine Spalte des aktuellen Datensatzes im übergeordneten Select zugreifen kann.
 
Zuletzt bearbeitet:
Danke, das trifft es. Allerdings ist diese Spalte aus der Tabelle der äußeren Abfrage angeblich nicht vorhanden. Liegt der Fehler darin, dass ich die Unterabfragen unter FROM angebe? Eine andere Möglichkeit sehe ich allerdings nicht, außer drei separate Abfragen zu machen. Ich kann einmal die Abfrage posten, um die es aktuelle geht. Hier sind nur zwei Tabellen involviert.

SQL:
SELECT *
FROM `chartlist_tracks`, (
	SELECT `position` AS `position`
	FROM `chartlist_positions`
	WHERE `chartlist_positions`.`track_id` = `chartlist_tracks`.`id`
	ORDER BY `cal_week` DESC
	LIMIT 0,1
) AS `cweek`, (
	SELECT `position` AS `position_lw`
	FROM `chartlist_positions`
	WHERE `chartlist_positions`.`track_id` = `chartlist_tracks`.`id`
	ORDER BY `cal_week` DESC
	LIMIT 1,1
) AS `lweek`
WHERE `in_charts` != 0
ORDER BY `position` ASC

Die Tabelle chartlist_tracks enthält die relevanten Spalten "id", "in_charts", "artist" und "title". Die Tabelle chartlist_positions die Spalten "id", "track_id", "cal_week" und "position".
 
Zuletzt bearbeitet:
Zurück