Система бронирования PHP / MySQL - PullRequest
2 голосов
/ 20 августа 2009

В настоящее время я работаю над системой резервирования оборудования для моей школы.

Вот как выглядят мои таблицы:

tblEquipment:

     id    name          description
      1   Camera        Takes pictures
      2   Projector     Projects images
      3   Stereo        Plays music

tblEvents:

      id       equipmentID        start             end
       1          2,3           1251312300     1251315900    //Should I use comma delimited entries for equipmentID?   
       2           1            1251312300     1251315900    

По поводу моего проекта у меня есть пара вопросов:

1) Если зарезервировано несколько единиц оборудования, (что будет происходить чаще, чем нет), следует ли указывать «идентификаторы оборудования» через запятую в поле equipmentID?

2) В настоящее время, когда пользователь делает резервирование, он сначала выбирает свое «запрошенное время», а затем ему предоставляются доступные позиции. Вот что я использую для этого запроса:

$start = //user's requested time
$start = //user's requested time

SELECT equipmentID FROM tblEvents
 WHERE ($start >= start && $start <= end) 
 OR ($end >= start && $end <= end)
 OR ($start <= start && $end >= end

 while($row = mysql_fetch_array($data)) {

  echo $row['equipmentID'];  //Would echo something like: 
  echo "<br>";               //    2,3
                            //    1

 }

Мой вопрос такой:

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

Любая помощь в этом была бы великолепна, спасибо!

Ответы [ 2 ]

5 голосов
/ 20 августа 2009

Относительно № 1: Нет! Нет-нет-нет-нет-нет! Если у вас зарезервировано несколько единиц оборудования, у вас должно быть несколько строк в таблице резервирования (что здесь выглядит как tblEvents). Чтобы не дублировать другие поля в tblEvents, вы обычно создаете третью таблицу, например tblEventEquipment, в которой просто перечисляется, какое оборудование принадлежит какому событию.

Если вам нужен разделенный запятыми список для целей вывода (что маловероятно), вы всегда можете сгенерировать его с помощью GROUP_CONCAT(), но внутри таблицы вы хотите одну строку на зарезервированный элемент оборудования. В противном случае SQL не сможет эффективно (или действенно) определить, какое оборудование зарезервировано в конкретное время.

Что касается # 2, вы хотите запрос типа:

SELECT * 
FROM tblEquipment
WHERE NOT EXISTS (
  SELECT 1 
  FROM tblEvents 
  WHERE tblEvents.equipmentID = tblEquipment.equipmentID
    AND $end >= start AND $start <= end
)

Выбирает оборудование, для которого не резервирование. Обратите внимание, что я упростил вашу логику для определения, зарезервировано ли оборудование, выполнив всего два сравнения.

Наконец, несвязанное примечание: я настоятельно рекомендую не хранить временные метки в виде целых чисел в таблице базы данных. Используйте встроенный тип MySQL DATETIME. Если вам нужно конвертировать в / из отметки времени, вы можете использовать функции UNIX_TIMESTAMP() и FROM_UNIXTIME().

2 голосов
/ 20 августа 2009
  1. Нет, не используйте значения, разделенные запятыми. Если вы хотите, чтобы у пользователя была возможность извлекать несколько товаров, вам понадобится новая таблица:

    Таблицы: Пользователи , Свойство , Оформить заказ

    Новая таблица оформления заказа будет иметь следующие поля:

    • ID
    • person_id
    • PROPERTY_ID
    • checkout_date
    • checkin_date

    В этой таблице может быть несколько записей для любого конкретного пользователя. Пользователь может быть там один раз для ноутбука компании, и снова для проектора компании:

    1 | 12 | 23 | 2009-08-17 | 0000-00-00
    2 | 12 | 28 | 2009-08-17 | 0000-00-00

  2. Что касается проверки, если элемент зарезервирован, я бы в качестве поля в таблице property содержал логическое значение:

    is_reserved (BOOL)

    Поиск доступных предметов - это не что иное, как проверка всех предметов со значением BOOL, равным false, и отсутствие таблицы контроля в сочетании с отсутствием checkin_date.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...