SQL-запрос на наличие доступных слотов встреч за месяц - PullRequest
2 голосов
/ 19 января 2012

В настоящее время у меня есть запрос:

select a.day_of_week,
       a.time,
       a.id,
       '2012-01-10' as scheduleDate,
       a.max_customers,
       (SELECT count(b.id) 
        from appointments b 
        where b.date = '2012-01-10' AND 
              b.schedule_id = a.id) as current_customers 
from schedules a 
where a.showroom_id = 1 and
      a.day_of_week = DATE_FORMAT('2012-01-10','%W')

Предположим, что '2012-01-10' является переменной.

У нас есть приложение, которое является календарем. Когда пользователь щелкает день, этот запрос запускается, чтобы получить список слотов и количество людей, забронированных на данный момент (current_customers).

Вот странность - теперь они хотят иметь возможность получать весь месяц за раз. В настоящее время наш разработчик по сути делает 30 запросов, чтобы сделать это через цикл FOR в PHP.

Я думал о создании хранимой процедуры для этого, но вы все еще используете цикл. Объединение - это еще один вариант, но я думаю, это большой запрос.

Кто-нибудь имеет хорошее представление о том, как создать запрос, который выполнял бы вышеуказанное, но для всех дней в месяце или с переменным количеством дней?

Структура таблицы - назначения

Тип поля Разрешить пустое значение по умолчанию id int (11) Нет
customer_id int (11) Нет
associate_id int (11) Да schedule_id int (11) Нет
дата дата №
result_id int (11) Да текст заметки №
is_active tinyint (1) № 1 созданная временная метка No 0000-00-00 00:00:00 updated_at timestamp No 0000-00-00 00: 00: 00

расписания

Тип поля Разрешить пустое значение по умолчанию id int (11) Нет
showroom_id int (11) Нет
перечисление day_of_week («понедельник», «вторник», «среда», «четверг», «пятница», «суббота», «воскресенье») №
время нет № 1028 * max_customers int (11) Нет
is_active tinyint (1) № 1 созданная временная метка No 0000-00-00 00:00:00 updated_at timestamp No 0000-00-00 00: 00: 00

1 Ответ

0 голосов
/ 19 января 2012

За разъяснениями о том, как работает мой подзапрос с @sqlvars, взгляните на аналогичный поиск резервирования , который я предложил здесь . Подзапрос просто просматривает любую таблицу в вашей системе, чтобы получить столько записей, сколько дней вы хотите провести ... в этом примере - 30 дней. Все, что вам нужно сделать, это изменить начальную дату на «2012-01-10» или использовать «current_date ()», чтобы она всегда начиналась с текущей даты +30, и в противном случае параметры не требуются.

select
      a.day_of_week, 
      a.time, 
      a.id, 
      @r as scheduleDate, 
      a.max_customers, 
      (SELECT count(b.id) 
          from appointments b 
          where b.date = @r 
          AND b.schedule_id = a.id) as current_customers 
   from
      ( SELECT 
                 @r:= date_add(@r, interval 1 day ) OpenDate
            FROM 
                 (select @r := '2012-01-10') vars,
                schedules limit 30 ) JustDates,
      schedules a 
   where 
          a.showroom_id = 1 
      and a.day_of_week = DATE_FORMAT( @r,'%W')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...