Het volgende zou je op weg moeten helpen. misschien wil je mijn voorbeeld van de "Current_Date()"-functie aanpassen voor wat ook de startdatum van je reservering is en zoveel dagen uitgaat....
Dit maakt gebruik van MySQL inline-variabelen in de query. De innerlijke query is een eenvoudige voorbereiding van een reserveringsvariabele (@r) op basis van een startdatum ( current_date() ), en voegt zich bij de itemtabel. Door geen lidmaatschapsclausule te doen, zou het anders één datum voor elk item pakken. In mijn scenario overweeg ik slechts 30 dagen uit te gaan, dus ik heb een limiet van de eerste 30 items toegepast. Geen andere basis dan mij genoeg records te geven, zodat ik geen tijdelijke tabel van 30 records hoef te maken (of hoeveel dagen u ook wilt uitgaan). Dit creëert een alias-query "JustDates" en heeft een enkele kolom "OpenDate". Dit is de basis van datumbereiken om op te testen.
Dit is nu toegevoegd aan de itemstabel, maar geen enkele voorwaarde creëert een Cartesisch om te zeggen voor elke datum, vergelijk met elk item... volgens de WHERE-clausule maak ik me alleen zorgen over items met een SKU van "ABC123" weer hebben ze 10 serienummers #s of 100. Dit zou me nu een mogelijke 300 of 3000 opleveren (10 serie-items @ 30 dagen, of 100 serie-items @ 30 dagen.
Nu ik een "bereik" heb van alle individuele serienummers en mogelijke dagen om de beschikbaarheid te controleren, kan ik nu een aanvraag indienen via het reserveringssysteem. Dus, via een sub-select, en NOT IN voor een bepaalde overeenkomende SKU, SERIAL #, en de MOGELIJKE datum die wordt gevonden in reserveringen, wil ik alleen die behouden waar de gegeven OpenDate NIET wordt gevonden. Ik heb je tafelstructuren gesimuleerd en een handvol items, meerdere serienummers en gespreide reserveringsdatumbereiken ingevoerd en het werkt geweldig...
Uiteraard zou ik zorgen voor indexen op sku / serieel voor prestaties. De enige extra wijziging die ik zou kunnen aanbrengen is bij het opvragen van de reserveringen, om reserveringen uit te sluiten waarvan de einddatum vóór de betreffende startdatum ligt voor UW zoekopdracht, en optioneel, geen Startdatum> de LAATSTE datum die u overweegt. Als je een hoop reserveringen hebt die zich over jaren uitstrekken, wie geeft er dan om iets ouds, of iets in de toekomst uit de betreffende periode?
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