Mysql
 sql >> база данни >  >> RDS >> Mysql

Помощ при SQL заявка за намиране на следващата свободна дата за система за резервации

Следното трябва да ви подтикне. може да искате да коригирате моята извадка на функцията "Current_Date()" за каквато и да е началната ви дата на резервацията и излизане толкова много дни....

Това използва MySQL вградени променливи в заявката. Вътрешната заявка е проста подготовка на променлива за резервация (@r), базирана на някаква начална дата ( current_date() ) и се присъединява към таблицата с елементи. Като не прави клауза за присъединяване, иначе ще вземе една дата за всеки елемент. В моя сценарий обмислям да изляза само 30 дни, така че приложих ограничение от първите 30 артикула. Няма друга основа, освен да ми дадете достатъчно записи, така че да не се налага да създавам временна таблица от 30 записа (или колкото дни искате да излизате). Това създава заявка с псевдоним "JustDates" и има една колона "OpenDate". Това е основата на периодите от време за тестване.

Това вече е присъединено към таблицата с артикули, но никое условие не създава декартово, което да каже за всяка дата, сравняване с всеки артикул... според клаузата WHERE, аз се интересувам само от артикули с SKU от "ABC123", ако имат 10 серийни #s или 100. Това сега ще ми даде възможни 300 или 3000 (10 серийни артикула за 30 дни или 100 серийни артикула за 30 дни.

Сега, когато имам "обхват" от всички отделни серийни номера и възможни дни за проверка на наличността, вече мога да направя запитване към системата за резервации. Така че, чрез подизбор и НЕ В за дадена съвпадаща SKU, SERIAL # и ВЪЗМОЖНАТА дата, намиращи се в резервации, искам само да запазя тези, при които дадена OpenDate НЕ е намерена. Симулирах структурите на вашите таблици и поставих шепа артикули, множество серийни номера и разпределени диапазони от дати на резервация и работи чудесно...

Очевидно бих осигурил индекси на sku/serial за производителност. Единствената допълнителна промяна, която бих могъл да направя, е при запитване спрямо резервациите, за да изключа всякакви резервации, при които крайната дата е преди въпросната начална дата за ВАШАТА заявка и по избор да няма начална дата> ПОСЛЕДНАТА дата, която обмисляте. Ако имате много резервации, обхващащи години, кой се интересува от нещо древно или нещо в бъдещето от въпросния период от време.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Свързване на Google Cloud SQL с Wordpress на Google Compute Engine

  2. Практически ограничение на дължината на SQL заявката (по-специално MySQL)

  3. MySQL Премахване на дублиращи се колони в Left Join, 3 таблици

  4. преместване на таблица от една схема в друга схема?

  5. Времето за изчакване на JDBC връзката не може да се свърже отново