2009-07-13 7 views
-1

Ich habe eine Tabelle mit wöchentlichen Daten zu erhalten, die wie folgt aussieht:MySQL-Abfrage nicht-Daten für nicht belegte Termine

userID  Site    date 
------  ------   ------ 
Smith Ferris Wheel  2009-07-13 
Jones Outerspaceland  2009-07-13 
LChar Ferris Wheel  2009-07-14 
Smith  Underworld  2009-07-16 
Jones  Fish Bowl   2009-07-17 
Munson Go-Go Tech  2009-07-16 

Derzeit ich einen PHP-Skript, das zuerst den Datumsbereich bekommt (Montag - Freitag), führt dann eine Abfrage für jede Benutzer-ID für diesen Datumsbereich durch. Dann wiederhole ich die Ergebnisse und überprüfe die Lücken zwischen den Daten. Wenn eine Lücke vorhanden ist, wird das Datum ausgegeben und die Site wird als "Bleib nach Hause" aufgeführt. Es muss mehrere Tage hintereinander gebucht werden (wie wenn der Benutzer nur am Montag und Freitag in dieser Woche stationiert ist), und es muss am Ende jeder Woche ein zusätzlicher Schritt durchgeführt werden, um sicherzustellen, dass der Benutzer zu Hause bleibt Mittwoch (also Donnerstag und Freitag als Lücken füllen). Also gibt es drei Checks, die man machen muss, eine für Nutzer, die nicht am Montag anfangen, eine für Lücken zwischen den Tagen, und eine für Nutzer, die vor Freitag enden ... plus sie muss Tage für eine dieser Situationen ausmachen.

Das Skript erstellt im Grunde ein Array des Datumsbereichs zu überprüfen, und es hat seit Monaten funktioniert. JEDOCH

Ich frage mich, gibt es eine MySQL-Funktion, die Tage für jeden Benutzer zurückgegeben haben? Damit ich in der Abfrage "Bleib nach Hause" ausfüllen kann und kein funkiges Skript ausführen muss, das für andere Personen, die mit mir an meinem Skript arbeiten, ewig dauert?

Danke!

Antwort

0

Einfach! Drehen Sie die Abfrage um!

Das heißt:

  1. Erstellen Sie eine Lookup-Tabelle mit den Tagen der Woche
  2. Sculpt eine Abfrage, die eine LEFT_OUTER_JOIN auf der Lookup-Tabelle und Ihre Tabelle DAYNAME (Feld) führt. Das heißt, es werden alle Zeilen aus der Lookup-Tabelle zurückgeben und nur diejenigen, die in der Tabelle entsprechen ,,,

Ich bin mir nicht sicher, ob Sie von Person filtern möchten .. die Kriterien wie userid aussehen würde = 'Person' oder Benutzer-ID ist null

die resultierenden Daten werden sehen sein ...

  1. A ROW für alle Tage
  2. In der Folge wird UserIDs für Nicht Blank Tage existieren und null sein für Tage übersprungen
+0

Wenn ich eine Tabelle habe, die nur Montag - Sonntag ist, die ich wieder und wieder verwenden könnte, gibt es eine Datumsfunktion, die basierend auf dem tatsächlichen Datumsbereich diese Wochentage in tatsächliche Daten umwandelt? Eines meiner Ziele ist es, so viel von, wenn nicht alle, meine html tatsächlich von der SQL-Abfrage mit concat und whatnot zurückgegeben, so dass während der Verwendung Ihrer Idee den Trick für fehlende Tage zu finden, wäre es ideal, wenn sie diese zurückgegeben fehlende Wochentage als fehlende Daten (eingepackt in die HTML-Tags etc.). – Anthony

+0

Ja, es ist möglich, beides zu bekommen. Enthält Ihre Tabelle nur Daten für eine Woche? Fügen Sie in die Abfrage eine berechnete Spalte ein, die eine Datumsberechnung basierend auf dem Anfangsdatum (das Sie übergeben) durchführt. Es gibt auch die Option von UNION auf einer kleinen Tabelle mit Daten und Gruppierung von, um alle Duplikate zu entfernen. – CMB

+0

Wenn Sie nach einer Woche Daten meinen, hat die Tabelle nur Daten für eine bestimmte Woche, nein. Wenn Sie meinen, dass es nur jede Anfrage nach Daten für eine Woche ist, normalerweise, aber nicht immer, also nicht wieder.Ich denke, ich muss Joels Vorschlag folgen, stattdessen eine Tabelle mit Daten zu haben. Ich hätte lieber einen leichteren Tisch mit nur 7 Werten, aber es scheint, dass ich, um wirklich alles zu bekommen, was ich will, ohne den Luxus von Temp-Tischen, nur einen 365 * 20-Wert-Tisch mit nur jedem Tag des Jahres haben muss . – Anthony