![](/img/trans.png)
[英]How to get count from another table (zero when no data) using single query in 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.