sql >> Database teknologi >  >> RDS >> Mysql

Hjælp med SQL-forespørgsel for at finde næste ledige dato for et reservationssystem

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


  1. Tilføjelse af en ny SQL-kolonne med en standardværdi

  2. Maksimal størrelse af en varchar(max) variabel

  3. Brug MySQL Relational Databases på Ubuntu 10.04 LTS (Lucid)

  4. Få det aktuelle år, den aktuelle måned og den aktuelle dag i MySQL