如何在PHP中使用MySQL Found_Rows()?

如何在PHP中使用MySQL Found_Rows()?,php,mysql,sql-calc-found-rows,Php,Mysql,Sql Calc Found Rows,由于性能问题,我尽量避免进行计数。i、 e.从用户中选择计数 如果我在phpMyAdmin中运行以下内容,就可以了: SELECT SQL_CALC_FOUND_ROWS * FROM Users; SELECT FOUND_ROWS(); 它将返回行数。i、 e.用户数量 但是,如果在PHP中运行,则无法执行以下操作: $query = 'SELECT SQL_CALC_FOUND_ROWS * FROM Users; SELECT FOUND_ROWS(); ';

由于性能问题,我尽量避免进行计数。i、 e.从用户中选择计数

如果我在phpMyAdmin中运行以下内容,就可以了:

  SELECT SQL_CALC_FOUND_ROWS * FROM Users;
  SELECT FOUND_ROWS();
它将返回行数。i、 e.用户数量

但是,如果在PHP中运行,则无法执行以下操作:

  $query = 'SELECT SQL_CALC_FOUND_ROWS * FROM Users;
    SELECT FOUND_ROWS(); ';
  mysql_query($query);
PHP似乎不喜欢传入两个查询。那么,我该怎么做呢?

它的两个查询:

$query = 'SELECT SQL_CALC_FOUND_ROWS * FROM Users';
mysql_query($query);
$query = 'SELECT FOUND_ROWS()';
mysql_query($query);

PHP只能在每个mysql_查询调用中发出一个查询

您真的认为从表中选择所有行比计算它们快吗?
Myisam在表的元数据中存储了大量记录,因此选择COUNT*FROM table不必访问数据。

这是一个常见的误解,即SQL\u CALC\u FOUND\u ROWS的性能优于COUNT。请看Percona伙计们的比较:

回答您的问题:每个mysql\u查询调用只允许一个查询,如手册所述:mysql\u查询发送唯一查询不支持多个查询

使用ext/mysqli作为MySQL扩展时支持多个查询:

SQL\u CALC\u FOUND\u ROWS仅在使用LIMIT子句时有用,但仍想知道在没有LIMIT子句的情况下会找到多少行

想想这是怎么回事:

SELECT SQL_CALC_FOUND_ROWS * FROM Users;
您强制数据库检索/解析表中的所有数据,然后将其丢弃。即使您不打算检索任何行,DB服务器仍将开始从磁盘中提取实际数据,前提是您需要这些数据

用人的话来说,你买了超级杂货店的所有东西,但除了收银员旁边的小摊上的那包口香糖,你什么都扔掉了

鉴于:

SELECT count(*) FROM users;

让DB引擎知道,虽然您想知道有多少行,但您不能不关心实际数据。在大多数智能DBMS上,引擎可以从表的元数据中检索此计数,或者简单地运行表的主键索引,而不必接触磁盘上的行数据。

使用“联合”和空列:

$sql="(select sql_calc_found_rows tb.*, tb1.title
      from orders tb
           left join goods tb1 on tb.goods_id=tb1.id
      where {$where}
      order by created desc
      limit {$offset}, {$page_size})
      union
      (select found_rows(), '', '', '', '', '', '', '', '', '')
     ";
$rs=$db->query($sql)->result_array();
$total=array_pop($rs);
$total=$total['id'];

只有这段代码对我有效,所以我想与你分享

$Result=mysqli_query($i_link,"SELECT SQL_CALC_FOUND_ROWS  id From users LIMIT 10"); 
$NORResult=mysqli_query($i_link,"Select FOUND_ROWS()"); 
$NORRow=mysqli_fetch_array($NORResult); 
$NOR=$NORRow["FOUND_ROWS()"]; 
echo $NOR;

这是一种简单的方法,对我来说很有效:

$query = "
SELECT SQL_CALC_FOUND_ROWS * 
FROM tb1
LIMIT 5";

$result = mysqli_query($link, $query);

$query = "SELECT FOUND_ROWS() AS count";
$result2 = mysqli_query($link, $query);

$row = mysqli_fetch_array($result2);

echo $row['count'];

这就是我们所说的过早优化……顺便说一句,您不能使用mysql\u查询发送2个查询。您必须单独发送每个查询。如果您希望一次发送多个用户,请使用另一个数据库接口。完全正确,但如果我已将用户分组,并想计算这些组现在要分页的组数,请使用另一个数据库接口?这是一个简单的例子,在现实生活中,我有一个更复杂的组。我有一个包含limit子句的查询。现在我想使用find_行选择有限的数据和总匹配结果数。怎样我希望这样的东西不起作用是的,这个用例当然是从users LIMIT 10中选择SQL\u CALC\u FOUND\u ROWS*;然后选择查找的行;在这种情况下,RDBMS正在计算总预限值。优点是不必为计数和读取重新编写整个查询。是的,murvinlai,您需要执行2个查询。但是在PHP中,您需要看到可以有N个用户在线发送ind请求,因此,如果在同一连接中发生其他SQL执行,则发现的行不起作用,您需要按照相同的连接和顺序执行指令。一种方法是在一个单独的连接中执行命令,从结构中获取一个连接,执行查询并释放到结构。这将只显示10个,而不是总数!