我想检索未付款的预订表的所有详细信息。我用过MINUS操作符。但它没有用。它给出了SQL错误。如何获得付款表中不存在的bookingid。
这是我的代码。
$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是用户选择的开始和结束日期---
答案 0 :(得分:1)
只需使用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 :(得分:1)
确实MINUS不在mysql中。
您的查询相当简单,但我会避免使用NOT IN的解决方案,因为如果您的付款表中有大量记录,它根本不是最佳的。
我建议使用NOT EXISTS
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 )
答案 2 :(得分:0)
试试这个:
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
您可以检索所需的所有列,它也可以帮助您提高性能。