dedlfix: mysql: Designfrage / nochmal eine Rückfrage

Beitrag lesen

Tach!

Du kannst aus einer Datenbank mit einfacher Abfrage (also ohne zusätzliche Programmierlogik) immer nur das herausholen, was drinsteht.

Klar. Aber SQL hat ja eine Unmenge an Programmierlogig bereits integriert.

Ja, aber dazu müsstest du dich mit Stored Procedures befassen. Das ist sozusagen wie das Lernen einer Programmiersprache. Und dann kannst du dir ein Programm ausdenken, das das gewünschte Ergebnis bringt. Aber im Prinzip ist es egal, ob du das in einer Stored Procedure oder anderenorts (z.B. PHP) machst. Es ist jedenfalls deutlich aufwendiger als mal eben ein SQL-Statement aus dem Ärmel zu schütteln.

In der vorhergehenden Antwort habe ich noch den Fall übersehen, dass der Terminzeitraum vor dem Abfragezeitraum beginnt und danach endet. Das müsste noch ergänzt werden.

Hatte ich geahnt, daher mein User 4. 😉 Kannst Du mir sagen, wie ich das ergänzen muß?

Logik. Formuliere die Logik in normalen Worten aber exakt, dann hast du schon den Großteil, den du für das Formulieren des Codes brauchst. Ergänzen geht jedenfalls mit OR (die neue logik) zur vorhandenen Bedingung

Es bleibt aber, dass du diese Abfrage prinzipiell verwenden kannst, um Einträge zu finden, die mindestens teilweise im Abfragezeitraum liegen. Die Ergebnismenge besteht also aus diesen Datensätzen, die nur jeweils die Werte A und B enthalten. Den Rest müsste dann das abfragende Programm ermitteln. In dem würde ich über den Abfragezeitraum iterieren, beispielsweise mit PHPs DatePeriod-Klasse. Zu jedem dieser Tage müsste nun geprüft werden, ob A kleiner/gleich und B größer/gleich ist, um zu ermitteln, ob er für die Ausgabe relevant ist.

Ich verstehe das nicht. ich verstehe es soweit, dass meine Ergebnismenge größer ist und über php dann auf die korrekte menge begrenzt wird.

Deine Ergebnismenge ist vielmehr kleiner im Sinne der Aufgabenstellung, aber genau richtig, um die fehlenden Daten zu erzeugen.

Du hast deinen Abfragezeitraum und eine Menge Datensätze, die jeweils einen anderen Zeitraum beschreiben, der den Abfragezeitraum berührt. Und nun musst du aus diesen beiden Informationen jeweils die konkreten Tage ermitteln, die in beiden Zeiträumen liegen.

Mal eine Frage: Könnte das nicht dann sogar performanter sein, jedes "Tabellenfeld" selber abzufragen (ggf. über prepared Statement)? Unkomplizierter scheint mir das auf jeden Fall zu sein.

Unkompliziert kann sein, aber performant ist das nicht bei steigender Anzahl der Daten. Es ist eine Abwägungsfrage, und es wird den Bereich geben, ab dem eine solche Vorgehensweise anfängt, auffallend Zeit zu verbrauchen. Bei wenigen Datensätzen wirst du nichts merken, vielleicht auch noch nicht bei wenigen hundert oder tausend oder wie auch immer. Aber bedenke, dass du pro Datensatz und pro Tag des Abfragezeitraums eine Query absenden must. Das läppert sich recht schnell zusammen.

dedlfix.