Я хочу получить всю информацию о таблице бронирований, по которой не производилась оплата. Я использовал оператор МИНУС. Но не вышло. Это дает ошибку 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 - даты начала и окончания, выбранные пользователем ---

Таблица бронирования

таблица платежей

1
din 8 Сен 2016 в 17:24

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.

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

1
Gordon Linoff 8 Сен 2016 в 14:28

Действительно, МИНУСа нет в 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 )  
1
David Dierick 8 Сен 2016 в 14:43

Попробуйте и это:

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

Вы можете получить все столбцы, которые хотите, и это также может помочь вам в производительности.

0
Susang 8 Сен 2016 в 14:41