Ce qui suit devrait vous aider à démarrer. vous voudrez peut-être ajuster mon exemple de fonction "Current_Date ()" quelle que soit la date de début de votre réservation et sortir autant de jours ....
Cela utilise des variables en ligne MySQL dans la requête. La requête interne est une simple préparation d'une variable de réservation (@r) basée sur une date de début ( current_date() ) et se joint à la table d'éléments. En ne faisant aucune clause de jointure, il saisirait autrement une date pour chaque élément. Dans mon scénario, je n'envisage de sortir que 30 jours, j'ai donc appliqué une limite des 30 premiers articles. Aucune autre base que de me donner suffisamment d'enregistrements pour que je n'aie pas à créer une table temporaire de 30 enregistrements (ou le nombre de jours que vous souhaitez sortir). Cela crée une requête avec un alias "JustDates" et a une seule colonne "OpenDate". Il s'agit de la base des plages de dates à tester.
Ceci est maintenant joint à la table des articles, mais aucune condition ne crée un cartésien à dire pour chaque date, comparez avec chaque article ... selon la clause WHERE, je ne suis concerné que par les articles ayant un SKU de "ABC123" météo ils ont 10 numéros de série #s ou 100. Cela me donnerait maintenant un potentiel de 300 ou 3000 (10 articles en série @ 30 jours, ou 100 articles en série @ 30 jours.
Maintenant que j'ai une "gamme" de tous les numéros de série individuels et des jours possibles pour vérifier la disponibilité, je peux maintenant interroger le système de réservation. Ainsi, via une sous-sélection, et PAS DANS pour un SKU, un numéro de série et la date POSSIBLE correspondants trouvés dans les réservations, je souhaite uniquement conserver ceux où l'OpenDate donné n'est PAS trouvé. J'ai simulé vos structures de table et mis une poignée d'articles, plusieurs numéros de série et des plages de dates de réservation échelonnées et cela fonctionne très bien...
Évidemment, j'assurerais des index sur sku/série pour les performances. Le seul changement supplémentaire que je pourrais apporter est lors de l'interrogation des réservations, pour exclure toutes les réservations dont la date de fin est antérieure à la date de début en question pour VOTRE requête, et éventuellement, pas de date de début> la DERNIÈRE date que vous envisagez. Si vous avez une tonne de réservations s'étendant sur des années, qui se soucie de quelque chose d'ancien ou de quelque chose de lointain dans le futur par rapport à la plage de dates en question.
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