PHP PDO能够获取两个结果集吗?如果可以,一个结果集比多个结果集更好吗?

4
如果可能的话,我该如何获取两个结果集:
$sth=$dbh->prepare("SELECT * FROM tb1 WHERE cond1;
                    SELECT * from tb2 Where cond2");
$sth->execute();
$row=$sth->fetchAll();  print_r ($row);

这是两个完全不同的表格(没有任何共同字段)。

你为什么需要在一个语句中获取2个结果集? - Your Common Sense
#您的常识:您能否用英语重新表达您的问题。 - silversky
@silversky,我认为他的问题很明显。“为什么”你需要在一个语句中获取2个结果集? - Mike
1
嗯,因为我认为一次性获取所有需要的结果更好。 - silversky
1
是的,PDO 可以获取两个(或多个)结果集。我在下面的答案中给出了一个例子。 - Nigel Alderton
显示剩余3条评论
6个回答

13
是的,只要您使用的数据库支持,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);

一个存储过程返回多个结果集是完全合理的。

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

现在你的 $rowset 将会是一个数组。你可以使用 count() 函数来查看有多少个 rowset。然后使用 foreach 循环来获取每个 rowset。

1
根据您使用的PHP版本,您可能无法在每个查询/执行中执行多个语句。简而言之,不,最好不要返回一个查询中的两个单独的表。这两个表必须具有相同数量的列。在PHP中没有办法区分结果#1和结果#2。如果您想更改任一表格,则必须确保表格仍然兼容。您可以编写基准测试,运行几千个查询,首先作为两个单独的查询,然后作为UNION ALL(如上所建议)的查询。我怀疑您不会发现两者之间有太大的性能差异。如果SQL服务器在同一物理服务器上运行,则查询本身几乎是瞬时的,执行UNION ALL可能会导致性能下降。如果它通过网络连接到另一台服务器或通过互联网(出于任何原因),那么将抵消组合查询的好处。如果这些是语义上不同的信息片段,则将两个查询绑在一起从长远来看并不是一个很好的主意。这似乎是“过早优化”,正如Donald Knuth所说的那样,这是所有邪恶的根源。

0
                 $STH = $DBH->prepare('show create table `a`;
                            show create table `b`;
                            show create table `b`;
                        ');
                $STH->execute( );

                do {

                    $row =$STH->fetchAll(\PDO::FETCH_NUM);
                    if($row && count($row)>0){
                        $sql.=$row[0][1] . ';';
                    }
                } while ($STH->nextRowset());

一个循环中的多结果集

-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

然而,您应该评估为什么要使用两个单独的表。如果它们包含重叠的数据,则可能最好将其合并为一个表(如果可能)。


  1. 创建一个健康的数据库,将所有相似的数据存储在一个表中。
- Your Common Sense
@YourCommonSense 或许你是对的。我曾经设计过一个系统,用于跟踪某些更改。不同的事物可能会发生变化,因此对于每种类型,我都将其存储在不同的表中。有些是日期更改,有些是属性从一个值更改为另一个值,有些是添加/删除行。对于那些添加行的情况,我不想让它有一个“日期”列,因为这并不适用,所以我将它们分开了。也许我需要重新评估它的存储方式。 - Mike
@Mike 这是两个完全不同的表格,具有完全不同的ID。 - silversky
你为什么想要将完全不同的表格的结果合并在一起? - Your Common Sense
@silversky,也许您可以详细说明一下您的问题,并展示您实际想要完成的内容;表格中保存了什么,您希望对结果进行什么操作等。 - Mike
显示剩余2条评论

-2

如果这些表是相互连接的,也许你需要使用JOIN
或者如果它们是完全不同和无关的表,则需要进行2个单独的调用。

由于您的问题非常简短和模糊,因此无法提供更多信息。

无论如何,没有理由仅出于希望在一次旅行中运行所有查询而组合查询。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接