MySQL:仅获取结果集的计数

时间:2010-03-22 11:25:05

标签: php mysql

我在PHP / MySQL中使用MVC。

假设我使用10个具有不同查询的函数从数据库中获取详细信息 但在其他时候,我可能只想获得查询返回的结果计数 处理这种情况的标准方法是什么 我应该再写10个函数来复制几乎整个查询并只返回计数 或
我是否应该始终使用结果集
返回计数 或
我可以传递一个标志来指示该函数应该仅返回计数,然后根据该标志我将动态生成(选择部分)查询。

有没有更好的办法?

4 个答案:

答案 0 :(得分:2)

现在mysql支持子查询,您可以使用以下命令获取任何查询的计数:

  $count_query="SELECT COUNT(*) FROM ($query)";

那有多难?

然而,这种方法总是意味着你正在运行两个查询而不是一个(我不确定MySQL是否一定能够使用缓存的结果集来计算 - 试试看看)。 p>

如果您已经获取了整个结果集,那么计算PHP中的行可能比发出另一个查询更快。

MySQL中有两个函数可以在应用限制语句之前返回匹配的行数:

SQL_CALC_FOUND_ROWS和FOUND_ROWS()

http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows

下进行。

答案 1 :(得分:1)

如果只想要符合某些条件的行数,则不应使用结果计数,而应使用另一个仅选择count(*)的查询。

如果你需要数据和它的数量,你为什么不在结果数组上使用count()?

另一种方法是使用一些class可以返回数据和它; s count,但不是每个10个查询的不同类,而是一个单一的数据库访问类。

答案 2 :(得分:1)

我会选择国旗的想法。

再编写10个函数并复制/粘贴代码根本没有帮助。如果您始终也返回计数,这意味着只要您只对计数感兴趣,数据库仍然必须生成并传输可能非常低效的完整结果集。

有了旗帜,你就会有类似

的东西
function getData($countOnly=false) {
    // ...generate FROM and WHERE clause
    if ($countOnly) {
        $query = 'SELECT COUNT(*) '.$query;
    } else {
        $query = 'SELECT field1, field2, ...'.$query.' ORDER BY ...';
    }
    ...
}

答案 3 :(得分:0)

我通常会尽量在方法之间共享尽可能多的代码。可能性是:

  • 有一个select()和一个count()函数
    • 每个构建查询的特定部分
  • 和一个buildFromAndWhere()函数来构建常见的查询部分。
    • 并让select()count()使用该


用伪代码编写,看起来有点像这样:

function select($params) {
    return "select * "
            . from()
            . where($params)
            . "limit 0, 10";
}

function count() {
    return "count(*) as nbr "
            . from()
            . where();
}

function from() {
    return "from table1 inner join table1 on ... ";
}

function where($params) {
    // Use $params to build the where clause
    return "where X=Y and Z=blah";
}

这样,您在from()where()函数中拥有尽可能多的通用代码 - 考虑到查询的 hard 部分通常存在,它适用于最好的。


我更喜欢有两个独立的功能来选择和计数;我认为它使代码更容易阅读和理解。

我不喜欢一种方法的想法,它返回两个不同的数据(结果列表和总计数);我也不喜欢传递旗帜的想法:看看函数的调用,你永远不会知道那个参数意味着什么。