За последние 24 часа нас посетили 17826 программистов и 1678 роботов. Сейчас ищут 830 программистов ...

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

Тема в разделе "PHP для новичков", создана пользователем drkrol, 16 дек 2016.

  1. drkrol

    drkrol Активный пользователь

    С нами с:
    25 авг 2016
    Сообщения:
    38
    Симпатии:
    1
    Здравствуйте. Я пытаюсь дефрагментировать свою базу данных. Она выглядит вот так: http://sqlfiddle.com/#!9/9554b . Первая таблица отвечает за отображение номеров в гостинице, которые существуют, вторая - за существующие брони в гостинице. Если её визуализировать, то выглядит эту чудо вот так: [​IMG]
    Дефрагментировать - значит расположить брони (выделенное цветом - это брони) так, чтобы они были максимально приближены друг к другу, то есть вот так:
    [​IMG]
    И вот этот код с моей задачей справляется:
    PHP:
    1. set @today:=date('2016-12-11');
    2. update main M
    3.   join (
    4.    select cid, nomer
    5.      from (
    6.        select A.nomer,
    7.               @cstart:=if(@cnum=A.nomer,@cstart,A.start),
    8.               @cnum:=A.nomer,
    9.               @cid:=(select M.id
    10.                        from main M,allnomer MT
    11.                       where MT.nomer=M.numbernomer and MT.type='lux'
    12.                         and M.datestart>@cstart
    13.                         and find_in_set(M.id,@used)=0
    14.                       order by datestart
    15.                       limit 1
    16.                     ) cid,
    17.               @cstart:=(select dateend from main where id=@cid) dend,
    18.               @used:=coalesce(concat(@used,',',@cid),@used)
    19.          from (
    20.           select A.nomer, A.start
    21.             from (
    22.               select A.nomer,
    23.                      (select coalesce(min(dateend),@today-interval 1 day)
    24.                         from main M
    25.                        where datestart<=@today and M.numbernomer=A.nomer) start
    26.                 from allnomer A where type='lux'
    27.             ) A,
    28.             main M, allnomer MT
    29.            where MT.nomer=M.numbernomer and MT.type='lux' and M.datestart>A.start
    30.            order by A.start desc, A.nomer
    31.          ) A,
    32.          (select @cid:=0,@cnum:=0,@cstart:=NULL,@used:='') Y
    33.      ) X where cid is not null
    34.   ) U
    35.   on M.id=U.cid
    36. set M.numbernomer=U.nomer

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