【问题标题】:Combining the results of two separate MySQL queries结合两个单独的 MySQL 查询的结果
【发布时间】:2011-08-19 01:45:30
【问题描述】:

我正在尝试执行两个单独的数据库查询并将结果返回到一个表单。每个结果都写入一个表。

我希望能够将这两个查询合二为一,并按任务编号对结果进行排序。

第一个查询:

 //Booking  
    $Date= date("d/m/Y");
    $driver = $_SESSION['username'];
    $dbTaskRecords = "SELECT * FROM booking WHERE driver='$driver' AND Date= CAST('$Date_search' AS DATE) ORDER BY TaskNo ASC"; 
    $dbTaskRecords_result = mysql_query($dbTaskRecords);

第二个查询:

//Return Booking    
    $dbTaskReturn = "SELECT * FROM returnbooking WHERE driver='$driver' AND Date= CAST('$Date_search' AS DATE) ORDER BY TaskNo ASC";    
    $dbTaskReturn_result = mysql_query($dbTaskReturn);

然后通过while语句将结果输出到页面。

$i=0;
        while ($row = mysql_fetch_array($dbTaskRecords_result)){
        //Control Structure for Move Time on first Job of day           
        if ($i==0 ){
        $time = $row["Time"];
        //$time = 'N/A';

        }else{
            $time = 'N/A';
        }

        //Get Rego from trucks table        
        $truckID = $row["TruckID"];
        $Rego_select = mysql_query("SELECT VechicleRegistration FROM trucks WHERE TruckID = '$truckID'" )
        or die("Problem reading table: " . mysql_error());
        $Rego = mysql_result($Rego_select,0);

        //Get unregisted from trucks table
        $Unregisted_select = mysql_query("SELECT Unregistered FROM trucks WHERE TruckID = '$truckID'" )
        or die("Problem reading table: " . mysql_error());
        $Unregisted = mysql_result($Unregisted_select,0); 

        $id_note = $row["BookingID"];           


                echo    '<td><a href="taskpage.php?id='.$id_note.'"><button>'. $row['TaskNo']."</button><a/></td>";
                echo    "<td>". $time . "</td>";                           // Time Frame
                echo    "<td>". $Unregisted."</td>";                      // Pickup 
                echo    "<td>". $Rego."</td>";                           // Unregisted
                echo    "<td>".$row["PickupLocation"] . "</td>";        // Rego
                echo    "<td>".$row["DropOffLocation"] . "</td></tr>"; // Delivery
                $i=$i+1;//Control Set
                }
            echo'</tr>';

我对返回预订的结果重复相同的输出代码。

是否可以将两个查询合并为一个,以便两个表的结果集可以由 ASC 排序并由上述 while 语句输出。

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    这是避免Select * 的众多原因之一。你可以简单地使用一个联合

    Select Time, TruckId, TaskNo, PickupLocation, DropOffLocation
    From booking 
    Where driver='$driver' 
        And Date= CAST('$Date_search' AS DATE) 
    Union All
    Select Time, TruckId, TaskNo, PickupLocation, DropOffLocation
    From returnbooking
    WHERE driver='$driver' 
        And Date= CAST('$Date_search' AS DATE) 
    Order By TaskNo Asc
    

    在此解决方案中,您需要枚举列,并确保列的类型,按照它们在两个 Select 子句中的枚举顺序相同。

    【讨论】:

    • 干杯。我不确定如何将结果放入变量中。我试过 $time = mysql_result($dbTaskRecords,0);但这不起作用。
    • @Samuel Meddows - 您应该能够像只有一个 select 语句时那样访问列。
    • 如果两个子查询都在同一个表上,使用 SELECT * 没有错……有吗?
    【解决方案2】:

    据我所知,您可以通过三个选项来完成您所追求的目标。

    假设两个表有一个外键,您可以使用连接。

    您可以使用联合来附加两个结果集。

    您可以将两个查询都输出到一个数组中,然后遍历该数组以获取输出。这可能不如联合效率高,但可以更好地分离两个结果集。

    【讨论】:

      【解决方案3】:

      使用多个较小的表可以让您的数据井井有条,并确保列名相同。

      例如,如果我们有一家拥有大量客户的公司,并且客户可能是私人客户或公司,则为这些地址使用单独的表和 2 个带有 client_id 和 adres_id 或 company_id 和 adres_id 的参考表,地址将总是有相同的列名。

      不仅如此,如果某些信息有限,您也不会冒存储空白空间的风险...

      最后,您应该真正坚持使用 SQL 一次性获取所需的所有数据,并使用 PHP(或其他服务器端脚本)将这些数据格式化给用户。对于内部或私人网站来说这不是什么大问题,但是当您拥有更多用户时,您会希望限制数据传输的数量和大小。

      仅使用 1 个长查询通常比几个更小的查询要好。

      【讨论】:

      • 并不总是使用一个长查询更好。这取决于场景,在您进行测试之前,您永远无法确定哪个选项是最好的。查看此SO anser 了解更多信息
      猜你喜欢
      • 1970-01-01
      • 2015-09-08
      • 1970-01-01
      • 1970-01-01
      • 2013-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多