Php mysqli-将SELECT FOUND_ROWS()与准备好的语句一起使用

Php mysqli-将SELECT FOUND_ROWS()与准备好的语句一起使用,php,mysql,mysqli,Php,Mysql,Mysqli,我想知道如何使用LIMIT将SELECT FOUND\u ROWS()包含到现有查询中,或者是否有更好的方法在不使用LIMIT的情况下获取总行数 //SELECT * just for question $q = $this->db->mysqli->prepare("SELECT SQL_CALC_FOUND_ROWS * FROM countries_ship c

我想知道如何使用
LIMIT
SELECT FOUND\u ROWS()
包含到现有查询中,或者是否有更好的方法在不使用
LIMIT
的情况下获取总行数

//SELECT * just for question

$q = $this->db->mysqli->prepare("SELECT SQL_CALC_FOUND_ROWS *
                                 FROM countries_ship c
                                 JOIN items i
                                ON c.item_id = i.id
                                JOIN item_expire e
                                ON c.item_id = e.item_id
                                JOIN users u
                                ON i.user_id = u.id
                                LEFT JOIN bids b
                                ON i.id = b.item_id
                                LEFT JOIN publishers p
                                ON i.item_publisher = p.id
                                LEFT JOIN tags_rel tr
                                ON c.item_id = tr.item_id
                                JOIN tags t
                                ON t.id = tr.tag_id
                                LEFT JOIN countries co
                                ON i.item_location = co.id
                                WHERE ".$where."
            GROUP BY i.id ORDER BY ".$order." ".$limit."");

    $count_rows = $this->db->mysqli->query("SELECT FOUND_ROWS()");

/* return of var_dump($count_rows);
object(mysqli_result)#74 (5) {
  ["current_field"]=>
  int(0)
  ["field_count"]=>
  int(1)
  ["lengths"]=>
  NULL
  ["num_rows"]=>
  int(1)
  ["type"]=>
  int(0)
}
*/

$prep = join("", $prep);

    call_user_func_array('mysqli_stmt_bind_param', array_merge ( array($q, $prep), $this->helperClass->valRef($ref) ) );

    $q->execute();
    $rows = $this->helperClass->bindResults($q);

    $q->close();

    return $rows;
不确定这是否100%有效,但这就是我解决问题的方法

  • 更改了查询的开头
    SELECT SQL\u CALC\u FOUND\u ROWS
  • 已创建新阵列-
    $resArray=array()
  • 按照建议的方式移动第二个查询,并将两个结果都添加到
    $resArray

            $q->execute();
    
            $rows = $this->helperClass->bindResults($q);
    
            $q->close();
    
            $count_rows = $this->db->mysqli->query("SELECT FOUND_ROWS()");
    
            $count = mysqli_fetch_assoc($count_rows);
    
            $resArray[] = $count;
            $resArray[] = $rows;
    
            return $resArray;
    

  • 虽然我可能错了,但如果您只是想获得符合条件的行数,那么您应该像下面这样使用SQL的counting aggregate函数:

    SELECT 
        i.id,
        count(*)
    FROM 
        countries_ship c
            JOIN items i
                ON c.item_id = i.id
            JOIN item_expire e
                ON c.item_id = e.item_id
            JOIN users u
                ON i.user_id = u.id
            LEFT JOIN bids b
                ON i.id = b.item_id
            LEFT JOIN publishers p
                ON i.item_publisher = p.id
            LEFT JOIN tags_rel tr
                ON c.item_id = tr.item_id
            JOIN tags t
                ON t.id = tr.tag_id
            LEFT JOIN countries co
                ON i.item_location = co.id
    WHERE 
        ".$where."
    GROUP BY 
        i.id
    
    另一方面,如果希望以分页的方式获取计数和所有细节,最好只运行两个查询—一个查询聚合计数,另一个查询有限的结果


    编辑:我将I.id分组保留在查询中,因为它将为您提供匹配行的每个I.id的计数。如果您只需要总计,则可以将其从select子句和group by中删除,从而完全删除group by。

    如果使用
    SQL\u CALC\u FOUND\u行
    ,则只需移动到执行查询以计算结果的位置即可。因为它只有在运行原始查询后才有效。
    因此,移动
    $count\u rows=$this->db->mysqli->query(“选择找到的行()”)
    $q->execute()之后

    选择count(*)作为来自…的总计项目,这不就是返回带有限制的计数吗?就像您通常做的那样:将
    SQL\u CALC\u FOUND\u ROWS
    添加到
    select
    并发出第二个查询以获取结果。
    select FOUND\u ROWS()
    在运行任何类型的分页结果时都非常好,因为您可以立即返回响应总数。。。在我看来,这比玩弄
    COUNT(*)要好得多。
    jeroen说的基本上就是改变你的
    SELECT*
    选择SQL\u CALC\u FOUND\u行,{table.column etc}
    完成后,您可以在之后运行另一个查询(
    选择Find_ROWS()
    ),以获取如果没有限制的话会找到的结果总数。。。。但他能回答,他一针见血:)是的。。。我需要获得详细信息,将行数限制为12,并计算所有不受限制的行数。而且我还需要将出价计算为出价。这就是为什么我使用了
    groupby
    致命错误:未捕获异常“mysqli\u sql\u exception”和消息“命令不同步”;在
    $q->execute()
    之后移动
    $count\u行
    之后,现在不能运行此命令“
    。所以我在
    $rows=$this->helperClass
    之后移动了它。。。但是
    var\u dump
    的结果仍然是一样的。