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
的结果仍然是一样的。