代码之家  ›  专栏  ›  技术社区  ›  Andrew

mysql num_rows是否高效和/或标准实践?

  •  3
  • Andrew  · 技术社区  · 16 年前

    前一段时间,我用sqlite四处搜索,试图移植我的一些站点来使用它而不是mysql。我因为缺少计算结果的函数而挂掉了,比如php mysql_num_rows() . 在搜索了一点之后,我发现 this mail list 也就是说(据我所知),sqlite没有这种功能,因为它效率很低。它指出编写需要知道返回多少行的代码是不好的形式。

    我一般使用 mysql_num_rows 检查返回结果是否为空。例如:

    $query = "SELECT * FROM table WHERE thing = 'whatever'";
    $results = mysql_query($query);
    
    if (mysql_num_rows($results)) {
        while ($row = mysql_fetch_array($results)) {
            echo "<p>$row[whatever]</p>";
        }
    } else {
        echo "<p>No results found</p>";
    }
    

    强烈反对 mysql_num_rows()。 在sqlite社区中,我想知道对于PHP中的常规mysql来说,它是否如此高效。

    此外,有没有更好的、更被接受的方法来检查php中mysql结果集的大小? mysql_num_rows()。 ?

    编辑: 我不只是用 MySqL.NuxLanges 为了得到计数--我将使用 COUNT 对此进行查询。在输出所有内容之前,我使用它来检查是否有任何结果。这对于显示搜索结果很有用-并不总是保证会有结果。在sqlite世界,我必须发送一个 伯爵 查询,检查是否有内容,然后发送 SELECT 查询以获取所有内容。

    3 回复  |  直到 16 年前
        1
  •  10
  •   Brian Ramsay    16 年前

    你已经有东西告诉你,如果你有结果 mysql_fetch_array() . 如果没有更多的行要提取(从 php.net )

    $query = "SELECT * FROM table WHERE thing = 'whatever'";
    $results = mysql_query($query);
    if($results) {
        $row = mysql_fetch_array($results);
        if($row) {
            do {
                echo "<p>{$row[whatever]}</p>";
            } while($row = mysql_fetch_array($results));
        } else {
            echo "<p>No results found</p>";
        }
    
    } else {
        echo "<p>There was an error executing this query.</p>";
    }
    
        2
  •  0
  •   ryeguy    16 年前

    不管你是否真的使用你的 选择 Ed,所有行仍然返回。这是非常低效的,因为你只是丢弃了结果,但是你仍然让你的数据库为你做所有的工作。如果你所做的只是数数,那么你所做的所有处理都是白费的。您的解决方案是简单地使用 伯爵(*) . 恰好交换 伯爵(*) 在你想要的地方 选择 声明,你就可以走了。

    然而,这主要适用于将其作为 伯爵 . 在你的例子中,用法一点也不坏。您只需在循环中手动计算它们(这是SQLite用户的首选解决方案)。

    原因在底层的sqlite api中。它 doesn't return the whole result set 所以它无法知道有多少个结果。

        3
  •  0
  •   Zuu    16 年前

    正如您在邮件列表中找到的解释。返回行计数效率很低,因为需要分配大量内存来保存整个(剩余的)结果集。您可以做的就是简单地使用一个布尔值来测试是否有输出。

    $query = "SELECT * FROM table WHERE thing = 'whatever'";
    $results = mysql_query($query);
    
    $empty_result = true;
    while ($row = mysql_fetch_array($results)) {
        echo "<p>$row[whatever]</p>";
        $empty_result = false;
    }
    
    if ($empty_result) {
        echo "<p>No results found</p>";
    }