Følgende burde få dig i gang. du ønsker måske at justere mit eksempel på "Current_Date()"-funktionen for hvad der end måtte være din reservations startdato og gå ud så mange dage...
Dette bruger MySQL inline variabler i forespørgslen. Den indre forespørgsel er en simpel forberedelse af en reservationsvariabel (@r) baseret på en eller anden startdato (aktuel_dato() ), og slutter sig til elementtabellen. Ved ikke at gøre en deltagelsesklausul ville den ellers få en dato for hver vare. I mit scenarie overvejer jeg kun at gå ud i 30 dage, så jeg har anvendt en grænse på de første 30 varer. Intet andet grundlag end at give mig nok poster, så jeg ikke skal lave en vikartabel med 30 poster (eller hvor mange dage du vil gå ud). Dette opretter en aliasset forespørgsel "JustDates" og har en enkelt kolonne "OpenDate". Dette er grundlaget for datointervaller at teste for.
Dette er nu knyttet til genstandetabellen, men ingen betingelse skaber en kartesisk at sige for hver dato, sammenlign med hver vare... i henhold til WHERE-klausulen, er jeg kun bekymret over genstande, der har SKU på "ABC123", vejr de har 10 serier. #s eller 100. Dette ville nu give mig 300 eller 3000 mulige (10 serievarer @ 30 dage eller 100 serievarer @ 30 dage.
Nu hvor jeg har et "udvalg" af alle individuelle serienumre og mulige dage til at tjekke tilgængelighed, kan jeg nu forespørge mod reservationssystemet. Så via et undervalg og IKKE IN for en given matchende SKU, SERIE# og den MULIGE dato, der findes i reservationer, ønsker jeg kun at beholde dem, hvor den givne OpenDate IKKE findes. Jeg har simuleret dine bordstrukturer og indsat en håndfuld varer, flere serienumre og forskudte reservationsdatointervaller, og det fungerer fantastisk...
Selvfølgelig ville jeg sikre indekser på sku / serie for ydeevne. Den eneste yderligere ændring, jeg kan foretage, er, når jeg forespørger mod reservationerne, at udelukke reservationer, hvor slutdatoen er før den pågældende startdato for DIN forespørgsel, og eventuelt ingen startdato> den SIDSTE dato, du overvejer. Hvis du har et væld af reservationer, der spænder over år, hvem bekymrer sig om noget gammelt, eller noget i fremtiden fra det pågældende datointerval.
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