【问题标题】:PHP/SQL How can I make my query include results that has no records in another table yet?PHP/SQL 如何让我的查询包含另一个表中还没有记录的结果?
【发布时间】:2016-05-28 11:34:28
【问题描述】:

我有 2 个执行房间搜索的 php 代码。用户指定否。床位、入住日期和退房日期。第一个代码检索具有相应床位数的所有房间。第二个代码检查房间是否有现有预订,如果有并且预订日期与显示房间的用户输入日期不冲突,如果没有现有预订,则仅显示。

我的第一个php代码:

$sql = "SELECT rooms.rid, beds, orientation, price FROM rooms
        WHERE (beds = $nOfBeds)";
if ($rOrientation != "") {
$sql .= " AND orientation = '$rOrientation'";
}

$results = mysqli_query($conn, $sql)
or die ('Problem with query' . mysqli_error($conn));

我的第二个php代码:

<?php
    while ($row = mysqli_fetch_array($results)) { 

    $sql2 = "SELECT rid, checkin, checkout FROM bookings";

    $results2 = mysqli_query($conn, $sql2)
    or die ('Problem with query' . mysqli_error($conn));

    $row2 = mysqli_fetch_array($results2);

    if ($row["rid"] == $row2["rid"]) {
        if (($cInDate < $row2["checkin"] && $cOutDate <= $row2["checkin"]) ||
           (($cInDate >= $row2["checkout"] && $cOutDate > $row2["checkout"]))) {
?>
            <tr>
                <td><?php echo $row["rid"]?></td>
                <td><?php echo $row["beds"]?></td>
                <td><?php echo $row["orientation"]?></td>
                <td><?php echo $row["price"]?></td>
            </tr>
    <?php }
    } 
    } ?>

目前它在过滤掉冲突日期方面工作正常,但它也在过滤掉没有现有预订的房间。我在使用此代码时遇到的另一个问题是,它似乎不适用于具有相同房间 id (rid) 的多个预订,所以现在它只过滤有关第一次预订的日期。

这是我的预订桌:http://imgur.com/DGOko1f

这是房间表:http://imgur.com/ED5KFES

【问题讨论】:

  • 你可以用一个非常复杂的查询来完成它,使用连接并且不存在检查数据范围。
  • @splash58 你能详细说明一下吗?我尝试过使用 join 以及不同的 where 语句无济于事。
  • 为什么你需要多行试试我的代码

标签: php mysql sql


【解决方案1】:

你可以使用,

if($result != NULL) {
   // Execute code
} else {
   // Give NULL values or error
}

其他方式是,if(count($result) &gt; 0)

这样您可以获得无错误的结果。

【讨论】:

    【解决方案2】:

    nanjero05

    代码的一些内容。在第二个 php 代码中,您将对每个房间执行一个查询。这不太好,因为它会生成许多对数据库的请求。

    您还请求所有预订,然后在内存中过滤与房间对应的预订。它也不总是商品。您一次又一次地阅读每个房间的所有预订。

    一种解决方案是在第二个查询(第二个 php 代码)中添加一个条件以仅选择当前房间的预订。

     $rid = $row["rid"]
     $sql2 = "SELECT rid, checkin, checkout FROM bookings where rid = $rid";
    

    (注意:阅读有关 SQL 注入的信息以改进这一点)

    那么你知道如果 $result 没有记录,那么房间就没有预订。

    【讨论】:

      【解决方案3】:

      为什么你需要多个查询试试这个简单的一个班轮

      $sql = "SELECT rooms.rid, beds, orientation, price FROM rooms 
          WHERE beds = $nOfBeds AND rid NOT IN (SELECT bookings.rid FROM bookings WHERE user_checkin between checkin and checkout or ('user_checkin <= checkin AND user_checkout >= checkout)  )";
      

      【讨论】:

      • 几乎正确。您不检查 user_checkout > 和 user_checkin
      • 我没听明白你要说什么? @splash58
      • OR ('user_checkin = checkout)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-19
      • 2016-03-19
      相关资源
      最近更新 更多