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 中获取数据透视表与另一个表的关系?

将一个表的列中的数据与另一个表中的同一列进行比较

Mysql:一个表的一个字段与另一个表的两个字段之间的多重关系

将主表与另一个表中的所有记录进行比较,以得出主表的列值