2011-05-05 126 views
3

我试图做两个单独的数据库quires并将结果返回给窗体。每个结果都写入一个表中。结合两个单独的MySQL查询的结果

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

第一个查询:

//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语句输出。

回答

8

这是避免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 

在这个解决方案,您需要枚举列,并确保它们在两个选择条款列举列的类型,顺序是相同的。

+0

干杯。我不确定如何将结果输入变量。我试过$ time = mysql_result($ dbTaskRecords,0);但那不起作用。 – 2011-05-05 10:33:50

+0

@Samuel Meddows - 您应该可以像访问单个select语句时那样访问列。 – Thomas 2011-05-05 15:11:11

+0

如果两个子查询都在同一个表上,那么使用SELECT *没什么问题......是吗? – Rooster242 2014-03-20 20:53:42

2

从我可以告诉你有三个选项来完成你以后的事情。

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

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

您可以将两个查询输出到一个数组中并遍历该数组以输出。这可能不如联合会效率更高,但会使两个结果集之间有更大的分离。

0

使用多个小表保持数据的组织性并确保列名相同。

如果我们有一个公司有很多客户,并且客户可能是私人客户或公司,那么为这些地址和2个参考表使用client_id和adres_id或者company_id和adres_id,将始终具有相同的列名称。

不仅如此,但如果某些信息是有限的,你不要运行存储空闲空间的风险......

到底你真的应该坚持到SQL为让你在一个需要的数据去使用PHP(或其他服务器端脚本)将这些数据格式化给用户。这对于内部或私人网站来说并不是什么大问题,但是当你有更多的用户时,你会想要限制数据传输的数量和大小。

只使用1个长查询通常比几个更小。

+1

不总是使用一个长查询更好。这取决于场景,你永远无法确定这个选项是否最好,直到你测试。检查此[SO安塞尔](http://stackoverflow.com/questions/3910317/is-it-better-to-return-one-big-query-or-a-few-smaller-ones)知道更多 – Yaroslav 2012-10-11 07:03:28