你的這個要求靠一條SQL做出來估計不行。你說的這個條數(shù)的和,是指表一中的所有數(shù)據(jù)條數(shù)加上表二所有數(shù)據(jù)條數(shù)嗎?如果是這樣就要分兩次來查詢。
創(chuàng)新互聯(lián)建站是一家專業(yè)提供自貢企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計、H5開發(fā)、小程序制作等業(yè)務(wù)。10年已為自貢眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。
具體的實現(xiàn)步驟可以這樣:
1、把excel表格里面的項目數(shù)據(jù)讀取到一個數(shù)組里面,
2、循環(huán)數(shù)組里面的每一個項目,一個一個的來查對應(yīng)的tuiguangjh和ccfwwz各有多少,再加起來。
3、最后得到的數(shù)據(jù)再整合成一個新的數(shù)組,做為返回值返回。
注意:你的這兩個查詢都是用的模糊查詢,數(shù)據(jù)量太大的話這個過程會很慢。
最簡單的方法,把結(jié)果弄成一致,例如使用下面的SQL查詢語句:
select time,type,property1,property2,property3,price from xxxxxx……
union all
select time,type,property4,price,0,0 from xxxxxx……
union all
select time,type,property5,property6,0,0 from xxxxxx……
方法是使用UNION ALL合并查詢結(jié)果,對于查詢字段少的語句增加0或者空白、null等常量,使得查詢結(jié)果的字段數(shù)要相同。
為了得到特殊的排序,可以把上面的查詢結(jié)果插入臨時表,再從臨時表中查詢結(jié)果。
在PHP-FPM處理HTTP請求時,有時會遇到一個請求需要進(jìn)行多次MySQL查詢(在報表類應(yīng)用中比較常見)。通常我們會以串行方式查詢:
$link?=?new?mysqli();
$rs1?=?$link-query('SELECT?*?FROM?table1');
while?($row?=?$rs1-fetch_row())?{?...?}
$rs2?=?$link-query('SELECT?*?FROM?table2');
while?($row?=?$rs2-fetch_row())?{?...?}
$rs3?=?$link-query('SELECT?*?FROM?table3');
while?($row?=?$rs3-fetch_row())?{?...?}
串行查詢方式有個缺點:在MySQL返回數(shù)據(jù)之前,PHP一直是處于空等的狀態(tài),不會繼續(xù)往后執(zhí)行。如果數(shù)據(jù)量大或者查詢復(fù)雜,MySQL響應(yīng)可能會比較慢,那么以串行方式查詢會有一些延遲。給用戶最直接的感受就是 Loading… 的圈圈一直打轉(zhuǎn)。
那么有什么辦法可以減少查詢MySQL的時間?用多進(jìn)程并行查詢不行,因為PHP-FPM 中不允許用 pcntl_fork 一類的調(diào)用。
幸好還有 mysqlnd,mysqlnd提供了類似 stream_select 的機(jī)制(見 這篇文章) ,可以做到在單進(jìn)程中對MySQL并行查詢。這主要運用了mysqli_poll 和 reap_async_query 兩個函數(shù)。
還是通過例子來介紹MySQL并行查詢的實施方法。假設(shè)要并行地向MySQL發(fā)出10個查詢,最基本的代碼應(yīng)該是這樣的:
1.??$links?=?[];
2.??for?($i?=?0;?$i?!==?10;?$i++)?{
3.??????$links[$i]?=?new?mysqli('127.0.0.1',?'user',?'password',?'db1');
4.??????$links[$i]-query('SELECT?SLEEP(1)',?MYSQLI_ASYNC);
5.??}
6.??$allResult?=?[];
7.??while?(!empty($links))?{
8.??????$reads?=?$links;
9.??????$errors?=?$reject?=?[];
10.?????if?(!mysqli_poll($reads,?$errors,?$reject,?null))?{
11.?????????continue;
12.?????}
13.?????foreach?($reads?as?$read)?{
14.?????????$idx?=?array_search($read,?$links,?true);
15.?????????$allResult[$idx]?=?[];
16.?????????$result?=?$read-reap_async_query();
17.?????????while?($row?=?$result-fetch_row())?{
18.?????????????$allResult[$idx][]?=?$row;
19.?????????}
20.?????????$read-close();
21.?????????unset($links[$idx]);
22.?????}
23.?}
解釋下這段代碼的含義:
2~5行,同時發(fā)起10個MySQL連接,并發(fā)出查詢
注意query() 的第二個參數(shù)帶上了 MYSQLI_ASYNC 表示非阻塞查詢
10行,使用mysqli_poll 輪詢10個連接的查詢有無返回
mysqli_poll 的第一個參數(shù)$reads是個數(shù)組,包含需要輪詢那些連接。mysqli_poll 執(zhí)行完后,會改寫$reads,改寫后$reads包含的是那些已經(jīng)有數(shù)據(jù)返回連接。
mysqli_poll的第四個參數(shù),控制的是輪詢的等待時間,單位是“秒”。如果像本例當(dāng)中設(shè)置為null,那么mysqli_poll輪詢是阻塞的:只有監(jiān)聽的連接中,任意一個連接有數(shù)據(jù)返回了,mysqli_poll才會返回。如果等待時間設(shè)置為0,那么每次執(zhí)行mysqli_poll會立即返回,外層的while會頻繁循環(huán)。
第11~19行,遍歷已經(jīng)有數(shù)據(jù)返回的連接
reap_async_query和普通query一樣,返回的是mysqli_result,可以一行行fetch數(shù)據(jù)
20~21行,對于已經(jīng)獲得了數(shù)據(jù)的連接,下次mysqli_poll就不需要再輪詢這個連接了,所以關(guān)閉連接,并從$links數(shù)組刪除這個連接
當(dāng)所有的連接都返回了數(shù)據(jù),$links數(shù)組空了,while循環(huán)也就終止了。
使用并行查詢的方式,可以大大縮短處理HTTP請求的時間,假設(shè)本例中的10個SQL查詢,每個需要執(zhí)行1秒。因為是并行,處理所有的查詢,也只需要1秒左右。
$info=M('A')
-field('id,title,cate_id,type_id,type_name,cate_name')
-join('F ON A.type_id = F.type_id')
-join('G ON A.cate_id = G.cate_id')
-select();
BCDE表 以此類推,數(shù)組合并
至少三個方法可以實現(xiàn):
一、使用視圖來實現(xiàn)多表聯(lián)合查詢,
例如:創(chuàng)建視圖:create view userstoposts as select u.name,u.qq,p.post_id,p.title, p.contents, p.contents from users as u,posts as p where u.name=p.name
二、直接使用表聯(lián)合查詢
例如:select u.name,u.qq,p.* from users as u,posts as p where u.name=p.name
三、結(jié)合PHP語言實現(xiàn)
例:1、
?php
$Sql="select *from posts";
$Result=@mysql_query($Sql);
while($rows=mysql_fetch_assoc($Result)){
$sql1="select name,qq from users where name='".$rows['name']."'";
$result1=@mysql_query($sql1);
$rows1=mysql_fetch_assoc($result1);
$OUTPUT[]=array(
'name'=$rows['name'],
'qq'=$rows1['qq'],
'post_id'=$rows['post_id'],
'title'=$rows['title'],
'contents'=$rows['contents']
);
}
print_r($OUTPUT);//可以你需要的結(jié)果輸出
?