6

SELECT FOUND_ROWS() 不工作或返回 1 我不知道我在哪里出错

$qry ="SELECT SQL_CALC_FOUND_ROWS DISTINCT user_id, login_date
FROM login_members
WHERE (login_date BETWEEN '2012-02-13 00:00:00' AND '2013-02-13 23:59:59') 
LIMIT 0, 10";

$rs = mysql_query($qry);

$total_records = mysql_result(mysql_query("SELECT FOUND_ROWS()"),0,0);
4

7 回答 7

11

接受的答案似乎是错误的。因为它建议在使用 LIMIT 的查询之后使用 found_rows() 。

答案:问题是关于 RETURN 1 和在某些情况下 0 作为 found_rows(); 的结果。

在您的第一个 select 语句之后执行一些其他查询时会发生这种情况。特别是当您使用 IDE 或某些客户端运行查询时,会在查询之前和之后执行一些附加的“准备”查询。

found_rows() 将返回服务器上运行的 LAST 查询返回的结果数。在这种情况下,这不是我们所期望的。

因此返回 1 或 0 错误。

验证: 您可以通过在服务器上启用常规日志记录并执行查询来验证这一点。您将看到在“第一个查询和找到的行查询”之间执行了几个附加查询。

FIX 存储过程,或旧的 COUNT(*)。

性能方面几乎没有任何区别。

额外的

如果您的目标是查找返回的总行数,那很好。并且 SQL_CALC_FOUND_ROWS 的使用变得无关紧要。

这是一般规则,找到的行不需要 LIMIT,SQL_CALC_FOUND_ROWS 也不需要。但是它们中的三个可以一起使用来给出一个非常有用的结果。

即运行类似的东西。

SELECT  SQL_CALC_FOUND_ROWS * from some_table_name LIMIT 0,10; 
SELECT FOUND_ROWS();

如果我们运行 SELECT * from sometable_name,我们将获得查询将返回的行数;即:没有限制。

话说回来,

SELECT * from some_table_name LIMIT 0, 10; 
SELECT FOUND_ROWS(); 

会给我们结果的总数,其中限制的 cos 将 <=10。并且没有任何实际用途,但这不是错误。

于 2013-09-19T07:35:51.997 回答
8

一个SELECT语句可能包含一个LIMIT子句来限制服务器返回给客户端的行数。在某些情况下,希望知道在没有 LIMIT 的情况下该语句将返回多少行,但无需再次运行该语句。要获取此行数,SQL_CALC_FOUND_ROWS请在语句中包含一个选项SELECT,然后调用FOUND_ROWS()

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
    -> WHERE id > 100 LIMIT 10;

mysql> SELECT FOUND_ROWS();

第二个返回一个数字,表示如果没有该子句SELECT,第一个将返回多少行。SELECTLIMIT

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

于 2013-02-13T06:16:06.907 回答
5

使用这个查询

$qry ="SELECT DISTINCT user_id, login_date
FROM login_members
WHERE (login_date BETWEEN '2012-02-13 00:00:00' AND '2013-02-13 23:59:59') 
LIMIT 0, 10";

如果前面的 SELECT 包含 SQL_CALC_FOUND_ROWS,但如果前面的 SELECT 不包含 SQL_CALC_FOUND_ROWS,则 FOUND_ROWS() 返回前面的 SELECT 返回的行数

于 2013-02-13T06:13:09.657 回答
0

应该 :

$qry ="SELECT DISTINCT user_id, login_date FROM login_members
WHERE (login_date BETWEEN '2012-02-13 00:00:00' AND '2013-02-13 23:59:59') 
LIMIT 0, 10";

$rs = mysql_query($qry);

$total_records = mysql_result(mysql_query("SELECT FOUND_ROWS()"),0,0);

echo $total_records // display total record count

没有必要使用SQL_CALC_FOUND_ROWS

于 2013-02-13T06:29:28.923 回答
0

SQL_CALC_FOUND_ROWS并且FOUND_ROWS()在您想要限制查询返回的行数时很有用,但也可以在不再次运行查询的情况下确定完整结果集中的行数。一个示例是一个 Web 脚本,它呈现一个分页显示,其中包含指向显示搜索结果其他部分的页面的链接。使用FOUND_ROWS()允许您确定其余结果需要多少其他页面。

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
    -> WHERE id > 100 LIMIT 10;
mysql> SELECT FOUND_ROWS();

第二个返回一个数字,表示 如果没有该子句SELECT,第一个将返回多少行。 如果最近成功的 语句中没有该选项,则返回该语句返回的结果集中的行数。如果语句包含子句, 则返回不超过限制的行数。例如,如果语句包含or ,则分别返回 10 或 60 。SELECTLIMITSQL_CALC_FOUND_ROWSSELECTFOUND_ROWS()LIMITFOUND_ROWS()FOUND_ROWS()LIMIT 10LIMIT 50, 10

$qry ="SELECT SQL_CAL_FOUND_ROWS  *  
       FROM login_members
       WHERE (login_date BETWEEN '2012-02-13 00:00:00' AND '2013-02-13 23: 
59:59') 
       LIMIT 0, 10";

$rs = mysql_query($qry);

$total_records = mysql_query("SELECT FOUND_ROWS() as `found_rows`;");

echo $total_records // display total record count
于 2013-02-13T07:44:49.567 回答
0

对于总记录,使用简单:

 $total_records = array_shift(mysql_fetch_row(mysql_query('SELECT FOUND_ROWS()')));
于 2013-08-08T21:19:53.527 回答
0

您必须将 mysql.trace_mode 设置为关闭。

在每个 php 页面中使用它。

ini_set("mysql.trace_mode", "0");

或者您可以在 .htaccess 文件中设置它

php_value mysql.trace_mode "0"

这里:

<?php
ini_set("mysql.trace_mode", "0");

$qry ="SELECT SQL_CALC_FOUND_ROWS DISTINCT user_id, login_date
FROM login_members
WHERE (login_date BETWEEN '2012-02-13 00:00:00' AND '2013-02-13 23:59:59') 
LIMIT 0, 10";

$rs = mysql_query($qry);

$total_records = mysql_result(mysql_query("SELECT FOUND_ROWS()"),0,0);
echo $total_records;
?>
于 2013-11-29T16:21:46.460 回答