【问题标题】:Can php PDO fetch two results sets? And If yes, what is better 1 result set or more than 1?php PDO 可以获取两个结果集吗?如果是,那么 1 个结果集或多于 1 个结果集哪个更好?
【发布时间】:2013-08-04 04:56:54
【问题描述】:

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

$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 我认为他的要求很明显。 “为什么”你需要在一个语句中获取 2 个结果集?
  • 好吧,因为我认为最好将你需要的所有结果都带入一次“旅行”
  • 是的 PDO 可以获取两个(或更多)行集。我在下面的回答中给出了一个例子。

标签: php mysql pdo fetch set


【解决方案1】:
                 $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());

一个循环中的多结果集

【讨论】:

    【解决方案2】:
    $rowset[] = $sth->fetchAll(PDO::FETCH_OBJ);
    WHILE($sth->nextRowset()) {
        $rowset[] = $sth->fetchAll(PDO::FETCH_OBJ);
    }
    

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

    【讨论】:

      【解决方案3】:

      是的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);
      

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

      【讨论】:

        【解决方案4】:

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

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

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

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

        【讨论】:

          【解决方案5】:

          如果这些表已连接,您可能需要JOIN
          或者如果它是完全不同且不相关的表,则进行 2 个单独的调用。

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

          无论如何,没有理由仅仅为了一次运行所有查询而组合查询。

          【讨论】:

            【解决方案6】:

            要回答您的问题,不,您不可能这样做。你有两个选择:

            1. 将两个查询合并为一个
            2. 分别执行这两个查询并合并它们的结果

            由于 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 可能是唯一类似的数据,并且 可能 有正当理由在两个表中执行此操作。但是,是的,我同意你的看法。
            • @YourCommonSense 也许你是对的。我曾经设计了一个系统来跟踪所做的某些更改。不同的东西可以改变,所以对于每种类型,我将它存储在不同的表中。有些是日期的变化,有些是属性从一个值到另一个值的变化,有些是添加/删除行。对于添加行的那些,我不希望它有一个 DATE 列,因为它不适用,所以这就是我将它们分开的原因。也许我需要重新评估它的存储方式。
            • @Mike 有两个完全不同的表和完全不同的 id。
            • @Mike 分别执行两个查询并合并它们的结果是个好主意吗?我节省时间吗?还是 CPU 使用率?
            猜你喜欢
            • 1970-01-01
            • 2015-02-07
            • 1970-01-01
            • 2021-04-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-04-15
            • 2011-06-17
            相关资源
            最近更新 更多