0

我有 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)'];
          }     

所以总和(数量)等于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>

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

4

5 回答 5

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
于 2012-11-02T08:59:09.370 回答
0

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

就像是:

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'
于 2012-11-02T08:59:18.377 回答
0

您可以使用以下命令将所有三个查询合并为一个查询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'
于 2012-11-02T08:59:24.327 回答
0

更好地将您的 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'];

于 2012-11-02T09:06:01.683 回答
0

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

"SELECT sum(qty) FROM prereservation where id = $sample GROUP BY id;"
于 2012-11-02T09:07:46.550 回答