Здравствуйте. Я пытаюсь дефрагментировать свою базу данных. Она выглядит вот так:
sqlfiddle.com/#!9/9554b . Первая таблица отвечает за отображение номеров в гостинице, которые существуют, вторая - за существующие брони в гостинице. Если её визуализировать, то выглядит эту чудо вот так:
Дефрагментировать - значит расположить брони (выделенное цветом - это брони) так, чтобы они были максимально приближены друг к другу, то есть вот так:
И вот этот код с моей задачей справляется:
set @today:=date('2016-12-11');
update main M
join (
select cid, nomer
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=@cid) dend,
@used:=coalesce(concat(@used,',',@cid),@used)
from (
select A.nomer, A.start
from (
select A.nomer,
(select coalesce(min(dateend),@today-interval 1 day)
from main M
where datestart<=@today and M.numbernomer=A.nomer) start
from allnomer A where type='lux'
) A,
main M, allnomer MT
where MT.nomer=M.numbernomer and MT.type='lux' and M.datestart>A.start
order by A.start desc, A.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'); , то база данных будет выглядеть вот так:
Почему при смене даты происходит неверная дефрагментация? Подскажите, как исправить?