Tach!
Ich möchte mir nun für einen bestimmten Zeitraum die gesamte Materialliste anzeigen lassen mit der Anzahl der in diesem Zeitraum verfügbaren Anzahl des jeweiligen Materials.
Definiere "in dem Zeitraum verfügbar".
Ich kann mir die gesamte Materialliste anzeigen lassen, ich kann mir die Summen der jeweiligen im Einsatz befindlichen Materialien anzeigen lassen aber eine vernünftige Abfrage die mir anzeigt Material 1 nicht im Einsatz daher Anzahl m_gesamtanzahl, Material 2 im Einsatz daher Anzahl (m_gesamtanzahl-mp_anzahl), ... bekomme ich irgendwie nicht hin.
Datenbanken wie MySQL arbeiten mengenorientiert. Man sollte dazu ebenfals in Mengen denken, wenn man die Lösung eines Problems sucht. Du brauchst erstmal die Menge der Projekte in einem bestimmten Zeitraum. Das ist die erste Abfrage und das Ergebnis sollten die betroffenen ProjektIDs sein.
Dann brauchst du aus der Verknüpfungstabelle die Materialien. Hier bin ich mir nicht ganz sicher, ob du alle brauchst oder nur die, die den betroffenen Projekten für den Zeitraum oder vielleicht gar zwar dem Projekt zugeordnet sind, aber im Zeitraum nicht vorkommen. Diese Datenmenge wird jedenfalls so eingeschränkt, dass nur die in der ersten Abfragemenge vorhandenen Material-IDs berücksichtigt werden. Dazu kann man in der WHERE-Klausel ein EXISTS vewenden und darin die erste Abfrage als Subquery einbauen. (Beispiele zu EXISTS gibts im MySQL-Handbuch, im Kapitel zu den Subquerys.) Diese Menge wirst du gruppieren wollen, um die Summen ermitteln zu können.
Zum Schluss fragst du die Materialtabelle ab, gejoint mit der Ergebnismenge der eben grad erarbeiteten Query. Wenn du alle Materialien brauchst, nimm einen Inner Join, sonst einen Left Join. Für den Left Join wirst du die Funktion COALESCE() benötigen, die dir das NULL aus der anderen Query in eine 0 übersetzt, sonst kommt NULL raus und nicht die Gesamtmenge: COALESCE(Feld der anderen Query, 0)
Diese Antwort habe ich nur theoratisch erarbeitet und habe nicht geprüft, welche Fallstricke in der Praxis auftreten können. Es kann durchaus sein, dass man dann einen anderen Weg gehen muss.
Achja, in der Test Umgebung habe ich MySql 5.0.67 - weiß allerdings noch nicht welche Version ich in der Echtumgebung haben werde.
Die ist ja uralt.
dedlfix.