Tach!
Das sind jetzt nur ein paar Spalten.
Ja, und das wird unnötig groß, wenn noch mehr Zeiten hinzukommen.
Ich will nun mit einer Abfrage überprüfen welche Zellen in einer bestimmen Spalte leer sind und diese abrufen und anzeigen lassen. Der Anfang ist klar:
SELECT * FROM `zeiten` WHERE `Name` = 'Heinz' ...
Ich gehe mal davon aus, dass Heinz nicht die Person ist, die sich eintragen will, sondern der Bearbeiter, der mit der Person einen Termin haben soll - oder so ähnlich. "Name" ist ein viel zu allgemeiner Begriff. Wenn es so ist, wie ich vermute, wäre "Bearbeiter" eine bessere Bezeichnung, die man weniger mit dem Namen von irgendwas/irgendwem anderen verwechseln kann.
Danach weiß ich nicht weiter, wie ich jetzt den Spaltenname nur von den Zellen bekomme die in der Zeile "Heinz" noch leer sind.
Das geht so nicht, weil du dann pro Spalte beziehungsweise Uhrzeit eine Abfrage brauchst. Diese Abfragen müssen dann mit UNION verbunden werden. Damit bekommst du ein "senkrechtes" Ergebnis, pro Zeit eine Zeile. Je Uhrzeit eine Abfrage ist jetzt nicht grad das, was man gern hätte.
In der SELECT-Klausel kannst du keine variable Anzahl an Spalten haben. Das wäre aber das, worauf es hinausläuft, wenn du sozusagen ein waagerechtes Ergebnis haben möchtest (alles in einer Zeile).
Datenbankseitig kannst du mit dem derzeitigen Tabellenformat am besten nur die Abfrage wie oben nehmen, ohne eine weitere Bedingung. Der Rest muss dann im auswertenden Programm erfolgen. Wenn du über die Spalten iterierst, kannst du feststellen, ob die Zeit belegt ist oder nicht.
Hat jemand eine Idee? Muss ich die Tabelle evtl. anders aufbauen, damit das überhaupt irgendwie funktioniert?
Tabellentechnisch wäre ein Aufbau mit den drei Spalten Bearbeiter, Uhrzeit (gegebenenfalls inklusive Datum) und Besucher besser. Du legst dann noch einen Unique Key über die beiden Felder Bearbeiter und Uhrzeit (ein Key über beide, nicht jeweils einen auf jede Spalte). Dann stellt bereits das DBMS sicher, dass es pro Berater und Uhrzeit keine zwei Einträge geben kann. Freie Termine belegen bei dem Design keinen Datensatz.
Das bedeutet dann aber auch, dass du keinen kompletten Plan für alle Uhrzeiten direkt aus dem DBMS bekommen kannst. Du kannst nur alle Datensätze eingeschränkt pro Bearbeiter und vielleicht Tag holen, die existieren. Die Uhrzeiten müsstest du dann im abfragenden Programm erzeugen, um darüber iterieren zu können, beispielsweise mit der DatePeriod-Klasse. Zu jeder Uhrzeit fragst du dann die Ergebnismenge der Datenbankabfrage, ob eine Zeile vorhanden ist.
Damit kannst du aber auch Abfragen recht einfach erstellen, wie: Gib mir alle Berater, die zu einer bestimmten Uhrzeit keinen Eintrag haben. Vorausgesetzt, es gibt eine weitere Tabelle mit allen Beratern, an die man dann mit einem Left Join die Uhrzeiten anbinden kann. Wenn statt einem Eintrag aus der Uhrzeiten-Tabelle ein NULL kommt, ist der Berater zu dieser Zeit verfügbar.
dedlfix.