4

如果可能,我如何获取两个结果集:

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

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

4

6 回答 6

13

YesPDO可以获取两个(或更多)行集,只要您使用的数据库支持它。我认为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);

单个存储过程返回多个行集是完全合理的。

于 2014-01-27T12:38:14.340 回答
2
$rowset[] = $sth->fetchAll(PDO::FETCH_OBJ);
WHILE($sth->nextRowset()) {
    $rowset[] = $sth->fetchAll(PDO::FETCH_OBJ);
}

现在你的 $rowset 将是一个数组。您可以使用 count() 来找出您有多少行集。并使用 foreach 循环获取每个行集

于 2017-07-21T17:25:37.673 回答
1

根据您使用的特定 PHP 版本,您甚至可能无法在每个查询/执行中执行多个语句。

简短的回答是不,在一个查询中返回两个单独的表并不是更好。两个表必须具有相同数量的列。在 PHP 中没有办法从结果 #2 中区分结果 #1。而且,如果您想更改其中任何一个表,则必须确保这些表仍然保持兼容。

您可能可以编写一个运行数千个查询的基准测试,首先作为两个单独的查询,然后一个作为 UNION ALL(如上所述)。我怀疑你会发现两者之间的性能差异很大。如果 SQL 服务器在同一物理服务器上运行,则查询本身几乎是即时的,执行 UNION ALL 可能会导致性能下降。如果它通过网络、网络上的另一台服务器或互联网(无论出于何种原因),这将抵消组合查询的好处。

如果这些是语义上独立的片段信息,那么从长远来看,将两个查询绑定在一起并不是一个好主意。这有点“过早优化”的味道,正如 Donald Knuth 所说,这是万恶之源。

于 2013-08-02T21:52:53.600 回答
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());

一个循环中的多结果集

于 2018-05-23T12:15:38.593 回答
-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

但是,您可能应该评估为什么要使用两个单独的表。如果它们包含重叠数据,如果可能的话,最好合并到一个表中。

于 2013-08-02T20:03:37.940 回答
-2

Perhaps you need JOIN if these tables are connected.
Or 2 separate calls if it's completely different and irrelevant tables.

It's impossible to tell more because of your extremely short and obscure question.

Anyway, there is no reason to combine queries only out of desire to run them all in one trip.

于 2013-08-02T20:23:49.007 回答