0

クエリでは、notキャンセルされたステータスのルーム名が返されますが、日付をトラップするためのクエリを削除すると、status !='cancelled'が機能しています。日付のトラップのクエリに何か問題がありますか?

$tbl_comp=mysql_query("SELECT * FROM roomlist 
WHERE type='$roomtype' and status = '1' 
and name NOT IN(select name from roomreservation where status  !='cancelled'

and 
arrival between '$arrival' and '$departure'
or departure between '$arrival' and '$departure'
or '$arrival'  between arrival and departure
or '$departure' between arrival and departure)");   
4

2 に答える 2

0

クエリの主な問題はstatus != 'cancelled'、日付テストの最初の部分にのみ適用されることです。

もう1つの問題はBETWEEN、包括的な比較を行うことですが、別の予約の出発と同じ日に新しい到着を受け入れる可能性があります。の代わりに<と>を使用して日付を比較する必要がありますBETWEEN。ただし、内部クエリのテストは次のように簡略化できます。

SELECT name FROM roomreservation
WHERE status != 'cancelled'    -- if cancelled: no conflict 
AND '$arrival' < departure     -- if $arrival >= departure: no conflict
AND '$departure' > arrival     -- if $departure <= arrival: no conflict  
于 2013-02-07T06:32:05.963 に答える
0

私のためのその仕事

SELECT
    *
FROM
    reservation
WHERE
    room = "3" AND
    status = 1 AND
    '2015-12-03' BETWEEN arrival AND departure OR
    '2015-12-06' BETWEEN arrival AND departure 
于 2015-12-02T09:13:28.363 に答える