sql >> Databáze >  >> RDS >> Mysql

Pomozte s SQL dotazem pro nalezení dalšího volného termínu pro rezervační systém

Následující by vám mělo pomoci. možná budete chtít upravit můj vzor funkce "Current_Date()" pro jakékoli datum zahájení vaší rezervace, které bude trvat tolik dní....

To používá v dotazu inline proměnné MySQL. Vnitřní dotaz je jednoduchá příprava proměnné rezervace (@r) na základě nějakého počátečního data ( current_date() ) a připojí se k tabulce položek. Tím, že byste neudělali klauzuli o žádném spojení, by jinak získal jedno datum pro každou položku. V mém scénáři uvažuji pouze o tom, že vyjdu na 30 dní, takže jsem použil limit na prvních 30 položek. Žádný jiný základ, než dát mi dostatek záznamů, abych nemusel vytvářet dočasnou tabulku 30 záznamů (nebo kolik dní chcete jít ven). Tím se vytvoří aliasový dotaz „JustDates“ a má jeden sloupec „OpenDate“. Toto je základ pro testovaná období.

Toto je nyní připojeno k tabulce položek, ale žádná podmínka nevytváří kartézský, který by pro každé datum řekl, porovnal s každou položkou... podle klauzule WHERE se zabývám pouze položkami, které mají SKU "ABC123" a mají 10 seriálů #s nebo 100. To by mi nyní dalo možných 300 nebo 3000 (10 sériových položek za 30 dní nebo 100 sériových položek za 30 dní.

Nyní, když mám „rozsah“ všech jednotlivých sériových čísel a možných dnů pro kontrolu dostupnosti, mohu nyní dotazovat rezervační systém. Takže prostřednictvím dílčího výběru a NOT IN pro danou odpovídající SKU, SÉRIOVÉ # a MOŽNÉ datum nalezené v rezervacích chci ponechat pouze ty, kde se dané OpenDate NENÍ nalezeno. Nasimuloval jsem vaši strukturu tabulek a vložil jsem do nich hrst položek, více sériových čísel a odstupňovaná období rezervací a funguje to skvěle...

Samozřejmě bych zajistil indexy na sku / serial pro výkon. Jedinou dodatečnou změnou, kterou mohu provést, je při dotazování na rezervace vyloučit všechny rezervace, jejichž datum ukončení je před datem zahájení příslušného VAŠEHO dotazu a volitelně žádné datum zahájení> POSLEDNÍ datum, které zvažujete. Pokud máte spoustu rezervací v rozmezí let, koho zajímá něco starověkého nebo něco v budoucnosti z daného období.

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. Podpora pro omezení cizího klíče v Rails

  2. 193:%1 není platná chyba aplikace Win32 s novou aplikací Rails

  3. Závažná chyba:Volání nedefinované funkce mysql_connect_errno() in

  4. Opravdu potřebujete fond připojení db pro kolejnice Unicorn?