Ich habe diese Tabellenstruktur:
EDIT komplexes Beispiel: versteckten Bereich hinzufügen
%Vor%mit 'Kategorie-Tag' als eindeutige Schlüssel. Ich würde eine Reihe von Daten für jede Kategorie extrahieren, entsprechend der Spalte "a" und gegebenem Grenzbereich, so:
%Vor%oder ähnlich.
Ich suche den besten Weg, es zu tun. Verwenden Sie nur mysql vorzugsweise aber auch mit ein wenig PHP.
HINWEIS1: nicht den ganzen Tag eingefügt: zwischen zwei Tagen können Nicht-Contiguos keine anderen Tage sein. In diesem Fall würde ich den verpassten Bereich mit der Spalte "a" = 0 ausgeben.
NOTE2: Ich habe es mit einer einfachen Abfrage und einigen PHP-Zeilen gemacht, aber ich mag es nicht, weil mein einfacher Algorithmus einen Zyklus für jeden Tag im Bereich benötigt, der für jede gefundene Kategorie multipliziert wird. Wenn die Reichweite zu groß ist und es zu viele Kategorien gibt, ist das nicht so gut.
ENDBEARBEITUNG: OK! Nach dem Lesen aller Kommentare und Antworten, denke ich, existiert keine gültige, effiziente und gleichzeitig lesbare Lösung. Daher ist die Antwort von Mosty Mostacho keine 100% gültige Lösung, aber es hat 100% gültige Vorschläge. Danke euch allen.
Neuer Schnitt:
Wie ich Ihnen in einem Kommentar gesagt habe, empfehle ich Ihnen dringend, die schnelle Abfrage zu verwenden und dann die fehlenden Daten in PHP zu verarbeiten, da dies schneller und besser lesbar wäre:
%Vor%Wenn Sie jedoch weiterhin die Abfrageversion verwenden möchten, versuchen Sie Folgendes:
%Vor% Beachten Sie, dass MySQL es Ihnen nicht erlaubt, Daten on-the-fly zu erstellen, es sei denn, Sie codieren UNIONS
für Beispiel . Dies ist ein teurer Prozess, deshalb empfehle ich Ihnen dringend, eine Tabelle mit nur einem integer
-Feld mit Werten von 1
bis X
zu erstellen, wobei X
, mindestens das Maximum ist Anzahl der Daten, die die min(day)
und max(day)
von Ihrer Tabelle trennen. Wenn Sie sich über dieses Datum nicht sicher sind, fügen Sie einfach 100,000
numbers hinzu und Sie können Reichweiten für mehr als 200 Jahre generieren. In der vorherigen Abfrage ist diese Tabelle seq
und die Spalte val
.
Dies führt zu:
%Vor% Ok, ich lüge. Das Ergebnis gibt tatsächlich eine counter
-Spalte zurück. Vernachlässige es einfach, denn es wäre weniger leistungsfähig, es zu entfernen (mit einer abgeleiteten Tabelle)!
und hier ist eine Ein-Liner-Brutalität für euch :) (Hinweis: Ändere den "datt" Tabellennamen.)
%Vor%und es ist Ausgabe:
%Vor%Hinweis: Dies ist das Ergebnis für nicht existierende 2012-01-02 in einer 01-12 Tage Tabelle.
Keine Notwendigkeit für PHP oder temporäre Tabellen oder irgendetwas.
DISCLAIMER: Ich habe das nur für Spaß getan. Dieser Trick kann zu verrückt sein, um in einer Produktionsumgebung verwendet zu werden. Deshalb bin ich nicht , dies als "echte" Lösung zu veröffentlichen. Auch ich bin nicht bereit zu erklären, wie es funktioniert :) Und ich habe es nicht überdenken / umgestalten. Es könnte elegantere Wege geben und Namen / Aliase könnten informativer sein. Also bitte keine Flamme oder so.
Hier ist meine Lösung. Sieht komplizierter aus als es ist. Ich denke, es ist leichter zu verstehen als andere Antworten, nichts für ungut:)
Testdaten einrichten:
%Vor%Und hier kommt es:
%Vor%Ergebnis sieht so aus:
%Vor%Damit dies so funktioniert, wie Sie es möchten, sollten Sie zwei Tabellen haben:
Jede Periode kann durch FOREIGN KEY
viele Tage damit verbunden sein. Mit der aktuellen Tabellenstruktur können Sie die kontinuierlichen Perioden auf der PHP-Seite am besten erkennen.
Erstens ist dies eine Erweiterung von @ Mostys Lösung.
Um Mostys Lösung zu ermöglichen, Kategorien / Datumskombinationen einzubeziehen, die in der Tabelle nicht vorhanden sind, habe ich den folgenden Ansatz gewählt:
Beginnen Sie damit, eine eindeutige Liste von Kategorien zu erhalten, und verbinden Sie diese dann mit dem gesamten Datumsbereich -
%Vor% Die obige Abfrage erstellt den vollständigen Datumsbereich unter Verwendung der Tabelle dummy
mit einem einzelnen Feld id
. Das id
-Feld enthält 0,1,2,3, .... - es muss genügend Werte haben, um jeden Tag im gewünschten Datumsbereich abzudecken. Dies kann dann wieder mit der ursprünglichen Tabelle verknüpft werden, um eine vollständige Liste aller Kategorien für alle Daten und den entsprechenden Wert für ein -
Dies kann dann auf die Abfrage von Mosty anstelle der Tabelle t
-
Vollständig auf mysql-Seite wird die Leistung adv haben: Sobald die Prozedur erstellt wurde, wird sie innerhalb von 0,35 - 0,37 Sekunden ausgeführt.
%Vor%o / p:
%Vor%Hier ist eine mysql-Lösung, die das gewünschte Ergebnis ohne den verpassten Bereich liefert.
PHP: Der fehlende Bereich kann über PHP hinzugefügt werden.
%Vor%Wenn ich Ihre Frage richtig verstehe, würde ich etwas verwenden, um:
%Vor%... und ...
%Vor%