如果是更多鈔票,如何可以取兩個結果集: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)。
如果是更多鈔票,如何可以取兩個結果集: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)。
要回答你的問題,不,你不可能這樣做。你有兩個選擇:
從MySQL查詢往往是昂貴的,我想如果在所有可能的組合查詢。你的情況,你可以使用一個簡單的UNION
:
SELECT row1, row2, row3
FROM tb1
WHERE id < 10
UNION ALL
SELECT row1, row2, row3
FROM tb2
WHERE id < 10
但是你應該評估爲什麼要使用兩個單獨的表。如果它們包含重疊的數據,如果可能的話,最好將它們組合成一個表格。
3.創建一個理智的數據庫來保存一張表中的所有相似數據 –
@YourCommonSense我不知道他的表結構是什麼樣子。據我所知,也許'id'是唯一的類似數據,並且*可能是在兩張表中做這件事的合理理由。但是,我同意你的看法。 – Mike
如果id是唯一的相似數據,那麼UNION不會工作 –
也許你需要JOIN
如果這些表連接。
或者2個獨立的調用,如果它是完全不同的和不相關的表。
由於您的問題極其短暫而模糊,因此無法分辨出更多。
無論如何,沒有理由只將查詢結合起來,以便在一次旅行中運行它們。
根據您使用的特定PHP版本,您甚至可能無法執行每個查詢/執行多個語句。
簡而言之,不,在一個查詢中返回兩個單獨的表格並不更好。兩個表都必須具有相同數量的列。 PHP中沒有結果#2的結果#1。如果您想更改其中任何一個表格,則必須確保這些表格仍保持兼容。
您可能可以編寫一個基準,運行幾千個查詢,首先是兩個單獨的查詢,然後是一個UNION ALL(如上所示)。我懷疑你會發現兩者之間的性能差異很大。如果SQL服務器運行在同一物理服務器上,則查詢本身即將發生,您可能會因執行UNION ALL而受到性能影響。如果它通過網絡連接到網絡上的另一臺服務器或通過互聯網(無論出於何種原因),這將抵消組合查詢的好處。
如果它們在語義上是分離的信息,從長遠來看,將兩個查詢結合在一起並不是一個好主意。這有點「不成熟的優化」,正如Donald Knuth所說,這就是萬惡之源。
是的PDO
可以獲取兩個(或更多)行集,只要您使用的數據庫支持它。我認爲MS SQL Server和MySQL都支持這個功能,但是在編寫時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);
單個存儲過程返回多個行集合是完全合理的。
$rowset[] = $sth->fetchAll(PDO::FETCH_OBJ);
WHILE($sth->nextRowset()) {
$rowset[] = $sth->fetchAll(PDO::FETCH_OBJ);
}
現在你的$ rowset將是一個數組。你可以使用count()來找出你有多少行集。並使用foreach循環來獲取每個行集合
什麼是你需要在一個語句中獲取2個結果集? –
#你的常識:你可以用英文重新翻譯你的問題。 – silversky
@silversky我認爲這是非常明顯的問題。 「爲什麼」你需要在一個語句中獲取2個結果集? – Mike