Здесь только полусерьезный ответ.
Если вам нужен один SQL-запрос, вы можете сделать это:
SELECT SUM(IF(ISNULL(r.rate), 10, r.rate))
FROM days AS d
LEFT JOIN rates AS r ON d.d BETWEEN r.start AND r.end
WHERE d.d BETWEEN '2011-03-15' and '2011-05-10';
Хитрость в том, что вам нужна таблица с именем "days"", который имеет одно поле даты d.Предварительно заполняйте эту таблицу, чтобы включать каждый день с этого момента и до вечности.Просто сделать с помощью скрипта;вам нужно только сохранить будущие бронируемые даты.
Обратите внимание, что вы должны быть осторожны при выборе даты начала и окончания.Например, если вы бронируете номер в период с 31 марта по 1 апреля, что именно это означает?
Это один день в 20 долларов и один день в 10 долларов?Или только один $ 20 в день?Или один день за 10 долларов?
Это само по себе не влияет на этот ответ, но влияет на то, как вы строите таблицу ставок и какие дни вы используете в качестве начала и конца.
Также в этой версии предполагается, что в поле ставок используется полный формат ГГГГ-ММ-ДД.Это не абсолютное требование, но если это всего лишь MM-DD, то вам нужно немного изменить соединение.
Лично я бы так не поступил.Вместо этого я просто перебрал бы дни в коде PHP, используя класс DateInterval
, и запросил цену таким образом.