2016-09-08 2 views
1

Ich möchte alle Details der Buchungstabelle abrufen, die die Zahlung nicht geleistet hat. Ich habe den MINUS-Operator benutzt. Aber es hat nicht funktioniert. Es gibt SQL-Fehler. Wie bekomme ich bookingid, was in der Zahlungstabelle nicht existiert?Wie wird der MINUS-Operator in SQL verwendet?

Dies ist mein Code.

$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 und new_date_out $ sind Benutzer ausgewählten Start- und Enddatum ---

Bookings Table

payments table

+1

Was DB das ist, speziell? Und was ist dein Fehler, genauer gesagt? –

+1

'MINUS' ist produktspezifisch, aber vielleicht nicht für MySQL? ANSI SQL hat "AUSSER". – jarlh

+0

mysql hat keinen Minusoperator. Es gibt 'nicht in (...)' als Alternative –

Antwort

1

Verwenden Sie einfach not exists oder 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); 

Dies gibt Ihnen auch die Möglichkeit, andere Felder von bookings zu erhalten.

Sie sollten auch Parameter in der Abfrage verwenden, anstatt sie in die Abfragezeichenfolge einzufügen.

0

dies versuchen, so gut:

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 

Sie alle Spalten abrufen können, die Sie wollen, und es kann auch Ihnen bei der Durchführung helfen.

1

In der Tat MINUS ist nicht in MySQL.

Sie Abfrage ist ziemlich einfach, aber ich würde eine Lösung mit NOT IN vermeiden, weil es überhaupt nicht optimal ist, wenn es viele Datensätze in Ihrer Zahlungstabelle gibt.

Ich würde Ihnen raten, die Verwendung von NICHT VORHANDEN

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) 
+0

erwähnenswert, dass NOT IN Ihnen funky Ergebnisse (wenn nicht gar keine) geben kann, wenn Ihre Unterauswahl NULL-Werte enthält. http://sqlinthewild.co.za/index.php/2010/02/18/not-exists-vs-not-in/ –

Verwandte Themen