2013-08-02 22 views
1

如果是更多鈔票,如何可以取兩個結果集:php PDO可以獲取兩個結果集嗎?如果是,有什麼更好的1個結果集或1個以上?

$sth=$dbh->prepare("SELECT * FROM tb1 WHERE cond1; 
        SELECT * from tb2 Where cond2"); 
$sth->execute(); 
$row=$sth->fetchAll(); print_r ($row); 

這是兩個完全不同的表(沒有共同fiels)。

+0

什麼是你需要在一個語句中獲取2個結果集? –

+0

#你的常識:你可以用英文重新翻譯你的問題。 – silversky

+0

@silversky我認爲這是非常明顯的問題。 「爲什麼」你需要在一個語句中獲取2個結果集? – Mike

回答

-1

要回答你的問題,不,你不可能這樣做。你有兩個選擇:

  1. 合併這兩個查詢到一個
  2. 執行單獨查詢和結合自身的結果

從MySQL查詢往往是昂貴的,我想如果在所有可能的組合查詢。你的情況,你可以使用一個簡單的UNION

SELECT row1, row2, row3 
FROM tb1 
WHERE id < 10 
UNION ALL 
SELECT row1, row2, row3 
FROM tb2 
WHERE id < 10 

但是你應該評估爲什麼要使用兩個單獨的表。如果它們包含重疊的數據,如果可能的話,最好將它們組合成一個表格。

+0

3.創建一個理智的數據庫來保存一張表中的所有相似數據 –

+0

@YourCommonSense我不知道他的表結構是什麼樣子。據我所知,也許'id'是唯一的類似數據,並且*可能是在兩張表中做這件事的合理理由。但是,我同意你的看法。 – Mike

+0

如果id是唯一的相似數據,那麼UNION不會工作 –

-1

也許你需要JOIN如果這些表連接。
或者2個獨立的調用,如果它是完全不同的和不相關的表。

由於您的問題極其短暫而模糊,因此無法分辨出更多。

無論如何,沒有理由只將查詢結合起來,以便在一次旅行中運行它們。

1

根據您使用的特定PHP版本,您甚至可能無法執行每個查詢/執行多個語句。

簡而言之,不,在一個查詢中返回兩個單獨的表格並不更好。兩個表都必須具有相同數量的列。 PHP中沒有結果#2的結果#1。如果您想更改其中任何一個表格,則必須確保這些表格仍保持兼容。

您可能可以編寫一個基準,運行幾千個查詢,首先是兩個單獨的查詢,然後是一個UNION ALL(如上所示)。我懷疑你會發現兩者之間的性能差異很大。如果SQL服務器運行在同一物理服務器上,則查詢本身即將發生,您可能會因執行UNION ALL而受到性能影響。如果它通過網絡連接到網絡上的另一臺服務器或通過互聯網(無論出於何種原因),這將抵消組合查詢的好處。

如果它們在語義上是分離的信息,從長遠來看,將兩個查詢結合在一起並不是一個好主意。這有點「不成熟的優化」,正如Donald Knuth所說,這就是萬惡之源。

9

是的PDO可以獲取兩個(或更多)行集,只要您使用的數據庫支持它。我認爲MS SQL ServerMySQL都支持這個功能,但是在編寫時SQLite沒有。

你想要的功能是PDOStatement::nextRowset

所以在你上面的例子,你可能會做這樣的事情;

$sth = $dbh->prepare("SELECT * FROM tb1 WHERE cond1; 
         SELECT * FROM tb2 WHERE cond2"); 
$sth->execute(); 
$rowset1 = $sth->fetchAll(); 
$sth->nextRowset(); 
$rowset2 = $sth->fetchAll(); 

print_r($rowset1); 
print_r($rowset2); 

單個存儲過程返回多個行集合是完全合理的。

1
$rowset[] = $sth->fetchAll(PDO::FETCH_OBJ); 
WHILE($sth->nextRowset()) { 
    $rowset[] = $sth->fetchAll(PDO::FETCH_OBJ); 
} 

現在你的$ rowset將是一個數組。你可以使用count()來找出你有多少行集。並使用foreach循環來獲取每個行集合

相關問題