Я хочу получить всю информацию о таблице бронирований, по которой не производилась оплата. Я использовал оператор МИНУС. Но не вышло. Это дает ошибку SQL. Как получить идентификатор бронирования, которого нет в таблице платежей.
Это мой код.
$SQL ="SELECT bookingid FROM bookings WHERE checkindate >= '$new_date_in' AND checkoutdate <= '$new_date_out' MINUS SELECT bookingid FROM payments ";
$run=mysql_query($SQL,$con) or die ("SQL error");
---- $ new_date_in и $ new_date_out - даты начала и окончания, выбранные пользователем ---
3 ответа
Просто используйте not exists
или not in
:
SELECT b.bookingid
FROM bookings b
WHERE b.checkindate >= '$new_date_in' AND
b.checkoutdate <= '$new_date_out' AND
b.bookingid NOT IN (SELECT bookingid FROM payments);
Это также дает вам возможность получать другие поля из bookings
.
Кроме того, вы должны использовать параметры в запросе, а не вставлять их в строку запроса.
Действительно, МИНУСа нет в mysql.
Ваш запрос довольно прост, но я бы избегал решения с NOT IN, потому что это совсем не оптимально, если в вашей таблице платежей много записей.
Я бы посоветовал использовать НЕ СУЩЕСТВУЕТ
SELECT b.bookingid FROM bookings b
WHERE checkindate >= '$new_date_in'
AND checkoutdate <= '$new_date_out'
AND NOT EXISTS ( select 1 from payments p where b.bookingid = p.bookingid )
Попробуйте и это:
SELECT b.bookingid
FROM bookings b
LEFT JOIN payments p ON p.bookingid = b.bookingid
WHERE 'yourdatevariable' BETWEEN b.checkindate AND b.checkoutdate
AND p.bookingid IS NULL
Вы можете получить все столбцы, которые хотите, и это также может помочь вам в производительности.
Похожие вопросы
Новые вопросы
php
PHP — это широко используемый язык сценариев общего назначения с открытым исходным кодом, мультипарадигмальный, динамически типизированный и интерпретируемый, изначально разработанный для веб-разработки на стороне сервера. Используйте этот тег для вопросов о программировании на языке PHP.