Почему при другой дате брони дефрагментируются неверно?

Тема в разделе "Базы данных", создана пользователем drkrol, 16 дек 2016.

Модераторы: latteo
  1. drkrol

    drkrol Постоялец

    Регистр.:
    6 мар 2016
    Сообщения:
    107
    Симпатии:
    10
    Здравствуйте. Я пытаюсь дефрагментировать свою базу данных. Она выглядит вот так: http://sqlfiddle.com/#!9/9554b . Первая таблица отвечает за отображение номеров в гостинице, которые существуют, вторая - за существующие брони в гостинице. Если её визуализировать, то выглядит эту чудо вот так:

    [​IMG]

    Дефрагментировать - значит расположить брони (выделенное цветом - это брони) так, чтобы они были максимально приближены друг к другу, то есть вот так:
    [​IMG]
    И вот этот код с моей задачей справляется:
    PHP:
    set @today:=date('2016-12-11');
    update main M
      join 
    (
       
    select cidnomer
         from 
    (
           
    select A.nomer,
                  @
    cstart:=if(@cnum=A.nomer,@cstart,A.start),
                  @
    cnum:=A.nomer,
                  @
    cid:=(select M.id
                           from main M
    ,allnomer MT
                          where MT
    .nomer=M.numbernomer and MT.type='lux'
                            
    and M.datestart>@cstart
                            
    and find_in_set(M.id,@used)=0
                          order by datestart
                          limit 1
                        
    cid,
                  @
    cstart:=(select dateend from main where id=@ciddend,
                  @
    used:=coalesce(concat(@used,',',@cid),@used)
             
    from (
              
    select A.nomerA.start
                from 
    (
                  
    select A.nomer,
                         (
    select coalesce(min(dateend),@today-interval 1 day)
                            
    from main M
                           where datestart
    <=@today and M.numbernomer=A.nomerstart
                    from allnomer A where type
    ='lux'
                
    A,
                
    main Mallnomer MT
               where MT
    .nomer=M.numbernomer and MT.type='lux' and M.datestart>A.start
               order by A
    .start descA.nomer
             
    A,
             (
    select @cid:=0,@cnum:=0,@cstart:=NULL,@used:=''Y
         
    X where cid is not null
      
    U
      on M
    .id=U.cid
    set M
    .numbernomer=U.nomer

    Но если изменить set @today:=date('2016-12-11'); на set @today:=date('2016-12-05'); , то база данных будет выглядеть вот так: [​IMG]
    Почему при смене даты происходит неверная дефрагментация? Подскажите, как исправить?