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

Hilfe bei der SQL-Abfrage, um das nächste verfügbare Datum für ein Reservierungssystem zu finden

Das Folgende sollte Sie in Schwung bringen. Vielleicht möchten Sie mein Beispiel der "Current_Date()"-Funktion an das Startdatum Ihrer Reservierung anpassen und so viele Tage ausgehen ....

Dies verwendet MySQL-Inline-Variablen in der Abfrage. Die innere Abfrage ist eine einfache Vorbereitung einer Reservierungsvariablen (@r) basierend auf einem Startdatum ( current_date() ) und wird mit der Elementtabelle verknüpft. Wenn Sie keine Join-Klausel verwenden, würde es andernfalls ein Datum für jedes Element erfassen. In meinem Szenario erwäge ich nur, 30 Tage auszugehen, also habe ich ein Limit der ersten 30 Elemente angewendet. Keine andere Grundlage, als mir genügend Datensätze zu geben, damit ich keine temporäre Tabelle mit 30 Datensätzen erstellen muss (oder wie viele Tage Sie ausgehen möchten). Dies erstellt eine Alias-Abfrage „JustDates“ und hat eine einzige Spalte „OpenDate“. Dies ist die Grundlage der zu testenden Datumsbereiche.

Dies ist jetzt mit der Artikeltabelle verbunden, aber keine Bedingung erstellt einen kartesischen, um für jedes Datum zu sagen, mit jedem Artikel zu vergleichen ... gemäß der WHERE-Klausel befasse ich mich nur mit Artikeln mit der SKU "ABC123", Wetter, das sie 10 Seriennummern haben #s oder 100. Dies würde mir jetzt mögliche 300 oder 3000 geben (10 Serienartikel @ 30 Tage oder 100 Serienartikel @ 30 Tage.

Nachdem ich nun eine "Reichweite" aller einzelnen Seriennummern und möglichen Tage zur Prüfung der Verfügbarkeit habe, kann ich nun das Reservierungssystem abfragen. Über eine Unterauswahl und NOT IN für eine bestimmte übereinstimmende SKU, SERIENNUMMER und das MÖGLICHE Datum, das in Reservierungen gefunden wird, möchte ich nur diejenigen behalten, bei denen das angegebene OpenDate NICHT gefunden wird. Ich habe Ihre Tabellenstrukturen simuliert und eine Handvoll Artikel, mehrere Seriennummern und gestaffelte Reservierungszeiträume eingefügt, und es funktioniert großartig ...

Offensichtlich würde ich Indizes auf sku / serial für die Leistung sicherstellen. Die einzige zusätzliche Änderung, die ich möglicherweise vornehmen könnte, besteht darin, bei der Abfrage der Reservierungen alle Reservierungen auszuschließen, deren Enddatum vor dem betreffenden Startdatum für IHRE Abfrage liegt, und optional kein Startdatum> das LETZTE Datum, das Sie in Betracht ziehen. Wenn Sie eine Menge Reservierungen über Jahre hinweg haben, wen interessiert etwas Altes oder etwas weit in der Zukunft Aus dem fraglichen Datumsbereich.

select  items.sku,
        items.serial_number,
        JustDates.OpenDate
    from 
        ( SELECT 
                 @r:= date_add(@r, interval 1 day ) OpenDate
            FROM 
                 (select @r := current_date()) vars,
                items limit 30 ) JustDates,
        items
    where 
            sku = "ABC123"
        and sku not in ( select sku from Reservations
                            where items.sku = reservations.sku
                              and items.serial_number = reservations.serial_number
                              and justDates.OpenDate >= reservations.start_date
                              and justDates.OpenDate <= reservations.end_date )
    order by 
       items.serial_number,
       justDates.OpenDate