【问题标题】:combining results of 3 queries in one result将 3 个查询的结果合并为一个结果
【发布时间】:2012-11-02 08:55:27
【问题描述】:

我有 3 个查询,我希望使用 array_merge 和 array_unique 将所有结果都放在一个结果中。

这里是查询:

            $query1 = mysql_query("SELECT * FROM prereservation where '$arival' BETWEEN arrival and departure and room_id ='11' and status = 'active'");  
        while($rows1 = mysql_fetch_assoc($query1)){
        echo $rows1['id']. " - ". $rows1['qty'];
        echo "<br />";
        }

        $query2 = mysql_query("SELECT * FROM prereservation where '$departure' BETWEEN arrival and departure and room_id ='11' and status = 'active'");
        while($rows2 = mysql_fetch_assoc($query2)){
        echo $rows2['id']. " - ". $rows2['qty'];
        echo "<br />";
        }

        $query3 = mysql_query("SELECT * FROM prereservation where arrival > '$arival' and departure < '$departure' and room_id ='11' and status = 'active'");
        while($rows3 = mysql_fetch_assoc($query3)){
        echo $rows3['id']. " - ". $rows3['qty'];
        echo "<br />";
        }

example result is:    
for       $rows1     |     $rows2     |     $rows3
        id  |  qty   |   id  |  qty   |   id  |  qty
       -----|--------|-------|--------|-------|------
        01  |   1    |   01  |   1    |   02  |   1
        03  |   1    |   02  |   1    |   03  |   1
        04  |   1    |   03  |   1    |   04  |   1
        08  |   1    |   05  |   1    |   05  |   1

我不知道这是否正确?

$sample = array_unique(array_merge($rows1['id'], $rows2['id'], $rows3['id']))

我想为每个结果的 id 使用 array_merge 和 array_unique 所以剩下的 id 的最终结果是

01, 02, 03, 04, 05, 08.

对于下一个查询,我想要的只是这些 id 的总和(数量)。 但我不知道如何为此编写查询,这是我的示例:

$query = mysql_query("SELECT sum(qty) FROM prereservation where id = $sample");

        while($rows = mysql_fetch_array($query))
          {
          $total_qty = $rows['sum(qty)'];
          }     

所以 sum(qty) 等于 6。 请纠正我的编码错误,谢谢大家...

终于找到了解决办法,就在这里..

$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>

解决方案是结合你们所有的答案,谢谢你们..

【问题讨论】:

标签: php mysql sql date


【解决方案1】:

虽然不在子查询中使用UNION ALL 组合三个查询并计算它们的总数qty

SELECT SUM(qty)
FROM tableName
FROM
    (
        SELECT * 
        FROM prereservation 
        where ('$arival' BETWEEN arrival and departure) and 
                room_id ='11' and 
                status = 'active'
        UNION ALL
        SELECT * 
        FROM prereservation 
        where ('$departure' BETWEEN arrival and departure) and 
                room_id ='11' and 
                status = 'active'
        UNION ALL
        SELECT * 
        FROM prereservation 
        where (arrival > '$arival' and departure < '$departure') and 
                room_id ='11' and 
                status = 'active'
    ) a
GROUP BY colName

【讨论】:

    【解决方案2】:

    您可以使用 OR 子句将您的 3 个 SQL 语句合并为一个,因为对于 3 个不同的情况,您基本上是在同一张表上 SELECTing *。这样您就可以确保获得所有独特的结果。

    类似:

    SELECT * FROM prereservation where
    (
    (arrival > '$arival' and departure < '$departure')
    or ('$departure' BETWEEN arrival and departure)
    or ('$arival' BETWEEN arrival and departure)
    ) and room_id ='11' and status = 'active'
    

    【讨论】:

      【解决方案3】:

      更好地将您的 3 个查询合并为 1 个

      SELECT id, SUM(qty) as sumQty 
      FROM prereservation 
      WHERE 
      (
          ( arival BETWEEN '$arrival' AND 'departure' ) OR 
          ( departure BETWEEN '$arrival' AND '$departure' ) OR 
          ( arrival > '$arival' AND departure < '$departure')
      )
          AND room_id ='11' 
          AND status = 'active'
      GROUP BY id
      

      你可以echo $rows3['id']. " - ". $rows3['sumQty'];

      【讨论】:

        【解决方案4】:

        您可以使用select ... union select ... 将所有三个查询合并为一个查询:

        $query1 = mysql_query("SELECT * FROM prereservation where '$arival' BETWEEN arrival and departure and room_id ='11' and status = 'active' union SELECT * FROM prereservation where '$departure' BETWEEN arrival and departure and room_id ='11' and status = 'active' union SELECT * FROM prereservation where arrival > '$arival' and departure < '$departure' and room_id ='11' and status = 'active'");
        

        那么你就不需要将多个结果合并为一个了。

        不过,一种更简单且成本更低的方法是将 where 子句合并为一个并使用它:

        select * from prereservation
        where ('$arival' between arrival and departure
               or '$departure' between arrival and departure
               or arrival > '$arival' and departure < '$departure')
              and room_id ='11' and status = 'active'
        

        【讨论】:

          【解决方案5】:

          您应该在条件之间使用带有 OR 的单个查询,并使用 DISTINCT 确保没有重复项。至于最后一个查询:

          "SELECT sum(qty) FROM prereservation where id = $sample GROUP BY id;"
          

          【讨论】:

            猜你喜欢
            • 2013-07-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-11-20
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多