Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL findet das erste verfügbare Wochenende

Ich denke, die anderen übersehen die Frage ... Sie denken, dass Ihr Tisch möglicherweise bereits mit allen Wochenenden BESETZT ist und einen gewissen Status hat, um zu öffnen oder nicht ... Ich vermute, dass Ihr Tisch nur einen Datensatz HAT, WENN er reserviert ist ... daher müssen Sie Datensätze finden, die ÜBERHAUPT NICHT EXISTIEREN... basierend auf einer automatisierten Suche nach Daten...

Dies ist eine Änderung an einem anderen Beitrag, den ich gemacht habe hier

Obwohl ich den Kontext der Abfrage nicht geändert habe, habe ich nur die Spalten eingefügt, die IHRER Tabelle zugeordnet sind. Ich verstehe, dass Sie nur gegen einen einzigen Veranstaltungstisch antreten, und ich (eigentlich) auch. Um jedoch den Alias ​​„JustDates“ zu verstehen, erstellt diese INNERE VORABFRAGE eine dynamisch ausgefüllte Tabelle ALLER DATEN, indem sie eine kartesische Verknüpfung mit JEDEM anderen Tisch durchführt. In diesem Fall Ihre Reservierungstabelle „Veranstaltungsort“ (ich habe es nicht getan). Ihre eigentliche Tabellennamensreferenz wird nicht explizit angezeigt, also müssen Sie das ändern). Dies erstellt also im Wesentlichen eine Tabelle aller Daten, beginnend mit dem, was „heute“ ist, und geht 30 Tage lang (über das Limit), aber es könnten 40, 50, 300 oder so viele sein, wie Sie brauchen. vorausgesetzt, die „YourVenueTable“ hat mindestens so viele Aufzeichnungen wie Tage, die Sie testen möchten. (gleiche Klarstellung in der Post, aus der dies abgeleitet wurde). Dieser Ergebnissatz, der 30, 40 oder wie viele Tage auch immer ausgeht, wird NUR für den angegebenen Wochentag 1-Sonntag oder 7-Samstag vorgefiltert ... Es sollte also nur einen Ergebnissatz vom 23 30. Mai, 1. Mai, 7. Mai, 8. Mai, 14. Mai, 15. Mai, 21. Mai, 28. Mai usw.

JETZT haben Sie also eine dynamisch erstellte Ergebnismenge aller möglichen Tage, die Sie in Betracht ziehen. Jetzt wird das mit Ihrer tatsächlichen Tabelle für Veranstaltungsortreservierungen verknüpft und gefiltert, um NUR die DATE zurückzugeben, an denen es NICHT für den id_venue gefunden wird, um den Sie sich Sorgen machen. In Ihrem Datenbeispiel WÜRDE es am 23. und 24. April eine Übereinstimmung finden und diese Datensätze NICHT zurückgeben. Dasselbe gilt für den 30. April ... Es wird jedoch feststellen, dass der Datensatz in der Präqualifikationsliste, der den 1. Mai enthält, das Datum NICHT in der Tabelle des Veranstaltungsortes findet und daher das so enthält, wie Sie es erwarten ... Es wird dann weiter überspringen 7. und 8. Mai, dann zurück am 14., 15., 21., 28. Mai usw....

select JustDates.OpenDate
  from 
      ( select
         @r:= date_add( @r, interval 1 day ) OpenDate
      from
         ( select @r := current_date() ) vars,
         Venue 
      LIMIT 30 ) JustDates
   where
      DAYOFWEEK( JustDates.OpenDate ) IN ( 1, 7 )
      AND JustDates.OpenDate NOT IN
          ( select Venue.date
                from Venue
                where Venue.id_venue = IDYouAreInterestedIn
                  and Venue.Date = JustDates.OpenDate )
    order by 
       JustDates.OpenDate

Beachten Sie, und gemäß der anderen Reservierungsbuchung, dass die Abfrage nach Verfügbarkeitsdaten für Reservierungsdaten mit einem Limit von 30 oben JEDER Tisch im System sein kann, solange er MINDESTENS so viele Tage frei hat, wie Sie sich auf Reservierungen freuen möchten. . Wenn Sie die gesamte Verfügbarkeit für ein kommendes Jahr wünschen, möchten Sie, dass 365 Datensätze in der Tabelle für ein kartesisches Ergebnis verwendet werden, damit das @r dynamisch erstellte „Datums“-Datensätze durchläuft.