Följande bör få dig igång. du kanske vill justera mitt exempel på "Current_Date()"-funktionen för vad som än kan vara startdatumet för din bokning och att gå ut så många dagar...
Detta använder MySQL inline-variabler i frågan. Den inre frågan är en enkel förberedelse av en reservationsvariabel (@r) baserat på ett startdatum (current_date() ), och ansluter till objekttabellen. Genom att inte göra någon join-klausul skulle den annars få ett datum för varje objekt. I mitt scenario överväger jag bara att gå ut 30 dagar, så jag har tillämpat en gräns för de första 30 föremålen. Ingen grund mer än att ge mig tillräckligt med poster så att jag inte behöver skapa en temptabell med 30 poster (eller hur många dagar du vill gå ut). Detta skapar en aliasfråga "JustDates" och har en enda kolumn "OpenDate". Detta är grunden för datumintervall att testa för.
Detta är nu kopplat till objekttabellen, men inget villkor skapar en kartesisk att säga för varje datum, jämför med varje artikel... enligt WHERE-satsen är jag bara bekymrad över artiklar som har SKU på "ABC123" väder de har 10 serier. #s eller 100. Detta skulle nu ge mig möjliga 300 eller 3000 (10 serieartiklar @ 30 dagar, eller 100 serieartiklar @ 30 dagar.
Nu när jag har ett "utbud" av alla individuella serienummer och möjliga dagar för att kontrollera tillgänglighet, kan jag nu fråga mot bokningssystemet. Så, via ett underval, och INTE IN för en given matchande SKU, SERIE#, och det MÖJLIGA datumet som finns i reservationer, vill jag bara behålla de där det givna OpenDate INTE finns. Jag har simulerat dina bordsstrukturer och lagt in en handfull artiklar, flera serienummer och förskjutna bokningsdatumintervall och det fungerar utmärkt...
Självklart skulle jag säkerställa index på sku / serie för prestanda. Den enda ytterligare ändring jag kan göra är när jag frågar mot reservationerna, att utesluta alla reservationer där slutdatumet ligger före startdatumet i fråga för DIN fråga, och valfritt inget startdatum> det SISTA datumet du överväger. Om du har massor av reservationer som sträcker sig över år, vem bryr sig om något gammalt, eller något långt i framtiden från datumintervallet i fråga.
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