PHP/SQL - 如何过滤掉与另一个表的数据有冲突的记录?
Posted
技术标签:
【中文标题】PHP/SQL - 如何过滤掉与另一个表的数据有冲突的记录?【英文标题】:PHP/SQL - How can I filter out a record that has a *** with another table's data? 【发布时间】:2016-05-29 04:40:18 【问题描述】:我正在进行搜索房间查询,根据用户输入搜索可用房间;床位数,入住日期和退房日期。当前代码可根据床位数量搜索房间,但无法过滤出日期范围与用户输入日期重叠的现有预订房间。这是当前代码:
$sql = "SELECT rooms.rid, beds, orientation, price FROM rooms
WHERE beds = $nOfBeds AND rooms.rid NOT IN
(SELECT bookings.rid FROM bookings
WHERE $cInDate BETWEEN checkin AND checkout OR
($cInDate <= checkin AND $cOutDate >= checkout))";
if ($rOrientation != "")
$sql .= " AND orientation = '$rOrientation'";
$results = mysqli_query($conn, $sql)
or die ('Problem with query' . mysqli_error($conn));
这是我的预订表:
这是我的房间桌:
【问题讨论】:
您需要重新考虑您的表结构。如果预订有多个房间怎么办? 另外,如果酒店想根据人数或住宿天数修改定价怎么办? 【参考方案1】:($cInDate <= checkin AND $cOutDate >= checkout)
是有缺陷的,因为它只限制了更长的停留时间。
您可以将其替换为:
($cInDate <= checkin AND $cOutDate >= checkin)
【讨论】:
【参考方案2】:Julie Pelletier 是对的,关于签入和签出日期的 where 子句是有缺陷的。但是有更好的方法来解决它。
您需要所有不在用户指定窗口内的预订。所以,如果你能做出以下假设:
用户输入 $cInDate 在您的数据库中,为所有行签入然后,您只需要以下查询:
WHERE ($cOutDate < checkin OR $cInDate > checkout)
此外,在您的内部查询中,您可能希望将 SELECT bookings.rid FROM bookings
更改为 SELECT DISTINCT bookings.rid FROM bookings
以优化其上的 IN
子句。
【讨论】:
以上是关于PHP/SQL - 如何过滤掉与另一个表的数据有冲突的记录?的主要内容,如果未能解决你的问题,请参考以下文章
如何在更新/插入之前创建一个异常,我必须将一个表的属性值与另一个表的属性值进行比较?
是否可以在 Laravel 中获取数据透视表与另一个表的关系?