簡體   English   中英

如何使用單個查詢從多個MySQL表獲取數據

[英]How to get data from multiple mysql table using single query

我正在使用下面的代碼使用phpexcel將兩個mysql表中的列導出到excel文件中。

我通過運行兩次查詢來實現它。 有人可以通過僅運行一個查詢並使用LIKE和UNION來幫助我完成此操作。

謝謝!

編輯:根據要求,表的數量將不斷增加,但名稱將相同。所以必須找到一個解決方案,該解決方案將首先使用LIKE選擇數據庫中的所有表,然后從中查詢列數據所有的桌子。 然后將這些數據並排輸出到Excel工作表。 像col A1-AJ上的表1數據,制表符; e 2來自AL-AR的數據等等。

這是我的代碼:

<?php

// connection with the database 
$dbhost = "localhost"; 
$dbuser = "root"; 
$dbpass = "redhat"; 
$dbname = "was"; 

mysql_connect($dbhost,$dbuser,$dbpass); 
mysql_select_db($dbname); 

// require the PHPExcel file 
require 'phpexcel/Classes/PHPExcel.php'; 

$query = "SELECT servicedate,recdate,dostoreclag,casesrec,scandate,casesentered,casespending,casecountdiff,entrydate,rcvdtolag FROM hos1report";
$query1 = "SELECT servicedate,recdate,dostoreclag,casesrec,scandate,casesentered,casespending,casecountdiff,entrydate,rcvdtolag FROM hos2report"; 
$headings = array('Service Date','Rec. Date','DOS to Rec. Lag','Cases Rec.','scan Date','Cases Entered','Cases Pending','Cases Count Diff','Entry Date','Rec. to Entry Lag');

if ($result = mysql_query($query) or die(mysql_error())) { 
    // Create a new PHPExcel object 
    $objPHPExcel = new PHPExcel(); 
    $objPHPExcel->getActiveSheet()->setTitle('Report'); 
    $rowNumber = 8; 
    $col = 'A'; 

    foreach($headings as $heading) { 
       $objPHPExcel->getActiveSheet()->setCellValue($col.$rowNumber,$heading); 
       $col++; 
    } 

    // Loop through the result set 
    $rowNumber = 9; 

    while ($row = mysql_fetch_row($result)) { 
       $col = 'A'; 
       foreach($row as $cell) { 
          $objPHPExcel->getActiveSheet()->setCellValue($col.$rowNumber,$cell); 
          $col++; 
       } 
       $rowNumber++; 
    }

 } else {

 echo 'a problem has occurred... no data retrieved from the database';
 }  

 if ($result1 = mysql_query($query1) or die(mysql_error())) { 
    // Create a new PHPExcel object 
    $objPHPExcel = new PHPExcel(); 
    $objPHPExcel->getActiveSheet(); 
    $rowNumber = 8; 
    $col = 'L'; 

    foreach($headings as $heading) { 
       $objPHPExcel->getActiveSheet()->setCellValue($col.$rowNumber,$heading); 
       $col++; 
    }


    // Loop through the result set 
    $rowNumber = 9; 

    while ($row = mysql_fetch_row($result)) { 
       $col = 'L'; 
       foreach($row as $cell) { 
          $objPHPExcel->getActiveSheet()->setCellValue($col.$rowNumber,$cell); 
          $col++; 
       } 
       $rowNumber++; 
    }

 } else {

 echo 'a problem has occurred... no data retrieved from the database';
 }   

 // Freeze pane so that the heading line won't scroll 
    $objPHPExcel->getActiveSheet()->freezePane('A2'); 

    // Save as an Excel BIFF (xls) file 
    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); 

   header('Content-Type: application/vnd.ms-excel'); 
   header('Content-Disposition: attachment;filename="report.xls"'); 
   header('Cache-Control: max-age=0'); 

   $objWriter->save('php://output'); 

?>

所有表將具有相同的列但數據不同

在此處輸入圖片說明

使用聯合嘗試以下內容(閱讀https://dev.mysql.com/doc/refman/5.0/en/union.html

$query = "
SELECT servicedate,recdate,dostoreclag,casesrec,scandate,casesentered,casespending,casecountdiff,entrydate,rcvdtolag FROM hos1report
union
SELECT servicedate,recdate,dostoreclag,casesrec,scandate,casesentered,casespending,casecountdiff,entrydate,rcvdtolag FROM hos2report
";

編輯:給定您的更新,其中指出“將這些數據並排輸出到excel工作表。像col A1-AJ上的表1數據,制表符; e 2來自AL-AR的數據,依此類推”只是執行“選擇DISTINCT ... LEFT JOIN“而不是聯合...您可以更改名稱以反映該表,但這不是必需的,除非您在WHERE子句中添加條件...

    $query = "
    SELECT DISTINCT servicedate,recdate,dostoreclag,casesrec,scandate,casesentered,casespending,casecountdiff,entrydate,rcvdtolag FROM hos1report
left join hos2report";

性能將是可怕的,如果您可以顯示A1到AJ列中的所有數據,它將更加簡單...。您甚至可以添加一列,指定像這樣的源表

$query = "
SELECT 'hos1report' as tablename, servicedate,recdate,dostoreclag,casesrec,scandate,casesentered,casespending,casecountdiff,entrydate,rcvdtolag FROM hos1report
union
SELECT  'hos2report' as tablename, servicedate,recdate,dostoreclag,casesrec,scandate,casesentered,casespending,casecountdiff,entrydate,rcvdtolag FROM hos2report
";

更新

您確實應該提供一個數據模式(即使只是一個示例),以便人們可以將其放入SQLFIDDLE中並使用它。 另外,擁有我們可以使用的數據的復制/粘貼版本也很有幫助。

我為您創建了一個示例架構和小提琴。 轉至您數據的SQLFIDDLE樣本,您將看到如何在其中構建模式,在右側,您可以查詢模式數據並查看站點的工作方式。

我現在將嘗試解決您的新問題,即使我已經解決了您的原始問題,甚至都沒有支持。

注意:您應該真正合並兩個表,只是添加一個額外的列來確定數據是來自table1還是來自table2。 喜歡 ...

ALTER TABLE `hos1report` ADD `flag` tinyint(2) NOT NULL DEFAULT 0;

那么只需將來自表2的任何數據的flag設置為1,將來自表3的任何數據的f設置為2,將來自表4的任何數據設置為3。 而table1(現在表中的原始數據)的標志列將設置為默認值0。

反正...

如果第一個表的結果為0行,則僅從第二個表中提取。

  SELECT SQL_CALC_FOUND_ROWS 
      `servicedate`,`recdate`,`dostoreclag`,`casesrec`,`scandate`,
      `casesentered`,`casespending`,`casecountdiff`,`entrydate`,`rcvdtolag`
  FROM 
      `hos1report`

  UNION ALL 

  SELECT 
      `servicedate`,`recdate`,`dostoreclag`,`casesrec`,`scandate`,
      `casesentered`,`casespending`,`casecountdiff`,`entrydate`,`rcvdtolag`
  FROM 
      `hos2report`
  WHERE 
      FOUND_ROWS() = 0
SELECT t1.servicedate,t1.recdate,t2.servicedate ,t2.recdate  ... FROM hos1report t1 INNER JOIN hos2report t2 ON(t1.YOUR_PRIMARY_KEY = t2.YOUR_PRIMARY_KEY)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM