MySQL запрашивает одну таблицу на основе суммы записей или отсутствия записей в другой таблице - PullRequest
1 голос
/ 04 августа 2011

Я изо всех сил пытаюсь выбрать записи из таблицы местоположений (например, отелей) на основе их доступности, хранящейся в отдельной таблице.Чтобы избежать наличия большого количества записей доступности для каждого возможного комбинированного дня / местоположения, таблица доступности содержит записи только для ограниченной или отсутствующей доступности для определенной даты - поэтому отсутствие соответствующей записи означает, что имеется ПОЛНАЯ доступность.

Таблицы немного похожи на ...

местоположения: id, имя, maxRooms и т. Д.

доступность: locationID, date, roomsAvailable (целое число от нуля, означающее отсутствие доступности для maxRooms)

... и что мне нужно сделать, это выбрать все местоположения, которые - на определенный период времени - имеют некоторую доступность.Это означает, что у них либо нет соответствующих записей о доступности (то есть полностью доступных), либо сумма их соответствующих записей доступности. RoomsAvailable больше нуля.

У меня болит голова, просто пытаюсь объяснить это :-( любойидеи с благодарностью приняты ...

Ответы [ 4 ]

2 голосов
/ 04 августа 2011
SELECT locations.id FROM locations LEFT JOIN availability
    ON( locations.id = availability.locationID AND
        ( availability.roomsAvailable > 0 OR ISNULL( availability.locationID ) ) )
0 голосов
/ 08 августа 2011

Спасибо за ваши предложения всем. После их рассмотрения я придумал это комбинированное решение PHP / MySQL, которое работает только на MySQL 4 или более поздней версии ...

ВЫБРАТЬ * ИЗ локаций ГДЕ location.id НЕ В ( ВЫБЕРИТЕ отличную доступность.locationID ОТ наличия ГДЕ Наличие.date> = '$ periodStartYMD' И наличие.date <= '$ periodEndYMD' GROUP BY locationID HAVING сумма (наличие.availableRooms) = 0 AND count (Availability.locationID) = $ daysInPeriod) </p>

PHP переменные должны быть самоочевидными.

Подводя итог - Если в периоде меньше записей доступности, чем дней, это указывает на полную доступность записей пропущенных дней. Если есть запись, это означает отсутствие или ограниченную доступность.

Оператор sub-select получает все записи доступности, соответствующие местоположению, у которых общая доступность равна нулю и (бит, который ускользал от меня) - количество совпадающих записей, общее количество дней в периоде.

Таким образом, если для каждого дня имеется запись о доступности, а общее количество свободных мест равно нулю, не должно быть свободных номеров на весь период.

Фу - надеюсь, это что-то вроде и еще раз спасибо ...

0 голосов
/ 04 августа 2011

Я думаю, что вы можете сделать запрос, подобный этому, получить все местоположения, чья сумма доступных номеров превышает 0 на определенную дату, а затем получить все местоположения, которые не указаны в наличии.

SELECT * FROM locations 
WHERE id in 
(
  SELECT locationId
  FROM availability
  WHERE date >= '2011-05-01' and date <= '2011-07-01'
  GROUP by locationId
  HAVING SUM(roomsAvailable) > 0
) 
OR id not in (SELECT DISTINCT locationId FROM availabilty)
0 голосов
/ 04 августа 2011

Вам необходимо использовать LEFT JOIN

...