【问题标题】:Get Number of Rows from a Select Statement Efficiently有效地从 Select 语句中获取行数
【发布时间】:2011-12-14 05:49:39
【问题描述】:

直到最近我一直在使用mysql_real_escape_string() 来修复我的大部分变量,然后再对我的数据库进行 SQL 查询。一个朋友说我应该改用 PDO 的预处理语句,所以在阅读了一些关于它们的信息后,我现在切换到它们。

到目前为止,我在切换时只遇到了一个问题,那就是计算SELECT 语句返回的行数。有时在我的代码中,我会运行 SQL 查询,然后计算从 SELECT 语句返回的行数。根据是否返回结果集,我会采取不同的行动。有时我确实需要使用它的结果集。 MySQL 让我在mysql_num_rows() 之后直接转到mysql_fetch_assoc() 没有问题。但是,PDO 似乎没有 mysql_num_rows() 这样的东西。

我一直在阅读一些关于 SO 的回复,这些回复给了我一个解决方案,要么在 SQL 语句中使用 COUNT(),要么在结果集上使用 PHP 函数 count()。如果我在某些地方不需要结果集,COUNT() 在 SQL 语句中可以正常工作,但是,有几个人提到在结果集上使用 count() 效率相当低。

所以我的问题是,如果我需要计算选择的行数(如果有的话),我应该怎么做,然后运行带有结果集的脚本?在这种情况下,在结果集上使用count() 是唯一的方法,还是有更有效的方法?

下面是一个类似于我之前的 SQL 代码的简短示例:

$query=mysql_query('SELECT ID FROM Table WHERE Name='Paul' LIMIT 1);

if(mysql_num_rows($query)>0)
{
  print_r(mysql_fetch_assoc($query));
}
else
{
  //Other code.
}

谢谢。

编辑

我知道您在计算结果集之前在语句上使用了fetchAll()(这给了我我需要的东西),但我只是想找出最有效的做事方式。

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:
    $stmt->rowCount();
    

    http://php.net/manual/en/pdostatement.rowcount.php

    必须提取行(缓冲到内存中,或迭代)它才能工作。将您的 pdo 驱动程序配置为自动执行此操作的情况并不少见。

    【讨论】:

    • 手册声明它不适用于所有数据库。我想尝试一下不会有什么坏处,我只是接受我的数据库可能无法使用它。会试一试的。
    【解决方案2】:

    您必须使用 Count()。您可以运行两个查询,例如

    SELECT COUNT(ID) FROM Table WHERE Name='Paul' 
    

    你得到了计数,然后使用 select 子句运行查询

    SELECT ID FROM Table WHERE Name='Paul' LIMIT 1
    

    Count() 函数如果你像COUNT(ID) 一样使用它,它的效率一点也不低,因为很可能id 是主键并且有一个索引。 MYSQL 甚至不必访问该表。

    【讨论】:

    • 那么运行两个查询会比运行单个查询然后计算结果集更有效吗? 编辑 我是说 PHP 函数 count() 效率低下,而不是 SQL 函数 COUNT()
    • 在这种情况下,在这两种情况下,您都将结果限制为 1 个元素。所以很有可能,至少在某些方面是这样。
    猜你喜欢
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多