【问题标题】:Query for hotel reservation酒店预订查询
【发布时间】:2012-10-26 15:08:49
【问题描述】:

我在酒店预订系统中有三个查询,其中预订量是从房间总数中自动扣除的。我想要的所有这三个查询都只在一个查询中完成。我的查询如下所示:

$p =foreach 循环中,其中$p['id'] 是每个房间类的id$p['qty'] 是每个房间类的最大房间数。

$a = $p['id'];
$query = mysql_query("SELECT sum(qty) FROM prereservation where '$arrival' BETWEEN arrival and departure and room_id ='$a' and status = 'active'");
        while($rows = mysql_fetch_array($query))
          {
          $inogbuwin=$rows['sum(qty)'];
          }
$query = mysql_query("SELECT sum(qty) FROM prereservation where departure BETWEEN '$arrival' and '$departure' and room_id ='$a' and status = 'active'");
        while($rows = mysql_fetch_array($query))
          {
          $inogbuwin2=$rows['sum(qty)'];
          }
$query = mysql_query("SELECT sum(qty) FROM prereservation where '$departure' BETWEEN arrival and departure and room_id ='$a' and status = 'active'");
        while($rows = mysql_fetch_array($query))
          {
          $inogbuwin3=$rows['sum(qty)'];
          }

<select>
 <option value="0"></option>
 <? $counter = 1; ?>
 <? while ($counter <= ($p['qty'])-($inogbuwin + $inogbuwin2 + $inogbuwin3)){ ?>
 <option value="<?php echo $counter ?>"><?php echo $counter ?></option>
 <? $counter++;
 }?>
</select>

每次我在这三个查询的范围之间加上一个日期,扣除的总金额也会增加三倍,这就是我希望这三个查询合二为一的原因。

例如,我在数据库中有一条记录 arrival = 27/10/2012 and departure = 29/10/2012

范围内不可用的输入日期是

 $arrival = 27/10/2012 and $departure = 29/10/2012 
 $arrival = 26/10/2012 and $departure = 27/10/2012 
 $arrival = 29/10/2012 and $departure = 30/10/2012 
 $arrival = 26/10/2012 and $departure = 30/10/2012 
 $arrival = 29/10/2012 and $departure = 29/10/2012 

所以在这三个查询中的每个日期也是扣除,所以我希望这些查询合二为一。谢谢大家

毕竟我修复了错误,但只剩下一个问题。我只在一个月内固定了预订日期,问题是当到达和离开的输入不在同一个月时,它也不起作用。下面是我的代码。

<?
$a = $p['id'];
    $query = mysql_query("SELECT
    SUM(IF('$arrival' BETWEEN arrival and departure, qty, 0)) AS bu1,
    SUM(IF('$departure' BETWEEN arrival and departure, qty, 0)) AS bu2,
    SUM(IF(arrival > '$arrival' and departure < '$departure', qty, 0)) AS bu3
    FROM prereservation WHERE room_id ='$a' and status = 'active'");
    $row = mysql_fetch_array($query);

    $test1 = $row['bu1'];
    if ($row['bu1'] == $row['bu2']){
        $test2 = $row['bu2'] - $row['bu1'];
    }else{
        $test2 = $row['bu2'];
    }       
        $test3 = $row['bu3'];
    ?>      
<select id="select" name="qty[]" style=" width:50px;" onchange="checkall()">
<option value="0"></option>
    <? $counter = 1; ?>
<? while ($counter <= ($p['qty']) - ($test1 + $test2 + $test3)){ ?>
    <option value="<?php echo $counter ?>"><?php echo $counter ?></option>
    <? $counter++;
    }?>

请帮我解决这个预订查询,或者也许有其他方法可以在 php 代码中解决这个问题。谢谢大家。

我终于完成并找到了解决方案,这里是:

            $a = $p['id'];
        $query1 = mysql_query("SELECT DISTINCT id, SUM(qty)
        FROM prereservation 
        WHERE 
        (
            ( '$arival1' BETWEEN arrival AND departure ) OR 
            ( '$departure1' BETWEEN arrival AND departure ) OR 
            ( arrival > '$arival1' AND departure < '$departure1' )
        )
            AND room_id ='$a' 
            AND STATUS = 'active'");  
        while($rows1 = mysql_fetch_assoc($query1)){
        $set1 = $rows1['SUM(qty)'];
        }   
        ?> 
        <select id="select" name="qty[]" style=" width:50px;" onchange="checkall()">
        <option value="0"></option>
        <? $counter = 1; ?>
        <? while ($counter <= ($p['qty']) - $set1){ ?>
        <option value="<?php echo $counter ?>"><?php echo $counter ?></option>
        <? $counter++;
        }?>
        </select>

感谢大家分享你的想法,这个解决方案是你的答案的组合..再次感谢!!

【问题讨论】:

  • 我也试过这个查询,但它不起作用。 $query = mysql_query("SELECT sum(qty) FROM prereservation where ('$arival' BETWEEN 到达和离开) and (departure BETWEEN '$arival' and '$departure') and ('$departure' BETWEEN 到达和离开) and room_id ='$a' AND status ='active'");
  • 提供表结构、示例数据和你想要的结果。
  • 什么是arival?这是到达的错字还是你在做一些异国情调的命名方案?
  • 是的,是到货日期的输入
  • 请了解参数化查询。您的代码让您面临 SQL 注入攻击。 bobby-tables.com/php.html 向您展示如何在 PHP 中进行参数化查询。

标签: php mysql sql date


【解决方案1】:

你可以这样做:

SELECT
    SUM(IF('$arrival'    BETWEEN arrival   and departure,    qty, 0)) AS bu1,
    SUM(IF(departure    BETWEEN '$arrival' and '$departure', qty, 0)) AS bu2,
    SUM(IF('$departure' BETWEEN arrival   and departure,    qty, 0)) AS bu3
FROM prereservation WHERE room_id ='$a' and status = 'active'"

然后在 PHP 中:

$query = mysql_query(...);
$row = mysql_fetch_array($query);
$inogbuwin =$row['bu1'];
$inogbuwin2=$row['bu2'];
$inogbuwin3=$row['bu3'];
mysql_free($query);

包括习惯警告 mysql_ 函数are discouraged 迁移到PDO 会做得很好

不应该使用旧的 API,并且有一天它将被弃用并最终从 PHP 中删除。这是一个流行的扩展,所以这个 将是一个缓慢的过程,但强烈建议您将所有 带有mysqliPDO_MySQL 的新代码。

【讨论】:

  • 当您输入 $arrival = 29/10/2012 和 $departure = 29/10/2012 时,还有另一个日期冲突,扣除了 bu1 和 bu3,我该如何解决?请帮忙。谢谢。
  • 最简单的方法是添加一个例外:if ($arrival == $departure) { $inogbuwin++; $inogbuwin3++; }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-10
  • 2016-09-23
  • 1970-01-01
  • 2011-08-18
  • 2017-08-27
  • 2020-06-09
  • 1970-01-01
相关资源
最近更新 更多