Таблица:
бронирования : id, идентификатор_пользователя, идентификатор_объекта, дата1, ...
booking_status : id, book_id, статус
статус - int, диапазон от 1 до 9 (запрос, подтверждено, оплачено, отменено пользователем и тому подобное), поэтому мне нужны все заказы, где статус не менее 4 (что означает платный), но не больше значения чем 4 (что означает отмену и т. д.).
До сих пор SELECT выглядит примерно так (я пропустил некоторые поля (...), чтобы сократить его):
SELECT b.date1, ..., u.name FROM bookings b
LEFT JOIN user u ON (b.user_id = u.id)
LEFT JOIN booking_status bs ON (b.id=bs.book_id)
WHERE ((b.object_id=$object_id) AND (bs.status NOT IN (5,6,7,8,9)));"
... но он по-прежнему выбирает те бронирования, которые имеют статус бронирования больше 4. Есть идеи, как мне нужно изменить запрос ??
Заранее большое спасибо!
ОБНОВЛЕНИЕ: еще раз спасибо всем, я поражен тем, сколько прекрасных идей вы выдвинули! Есть действительно много способов сделать это, и я многому научился у вас, так что спасибо еще раз! Я попробую все ваши предложения и посмотрю на производительность, а пока я смешал ваши решения с этим запросом, , который работает на данный момент, но мне нужно проверить его дальше:
SELECT b.date, ..., u.name FROM bookings b
LEFT JOIN user u ON (b.user_id = u.id)
LEFT JOIN booking_status bs ON (b.id=bs.book_id AND bs.status<=4)
WHERE (b.object_id=$object_id) HAVING MAX(bs.status)=4
он не возвращает несколько строк, но возвращает строки с 4, исключает строки с более 4 и не имеет подзапросов ...
РЕДАКТИРОВАТЬ 2: Я снова отредактировал запрос ... с HAVING MAX (bs.status) = 4 он тогда работает ...
РЕДАКТИРОВАТЬ 3: извините, после тестирования различных случаев я должен признать, что я был слишком быстр, говоря, что это работает ...