SELECT FOUND_ROWS()在mysql中返回1

时间:2013-02-13 06:08:06

标签: php mysql sql

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);

7 个答案:

答案 0 :(得分:7)

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

ANSWER :问题是关于RETURN 1,在某些情况下是由于found_rows();

在您的第一个选择参数后执行其他查询时会发生这种情况。 特别是当您使用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 *来自sometable_name; 即:没有LIMIT。

说完了,

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

将给出结果的总数,其中限制的cos将<= 10。并没有任何实际目的,但这不是一个错误。

答案 1 :(得分:6)

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返回一个数字,表示如果没有SELECT子句,第一个LIMIT将返回的行数。

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

答案 2 :(得分:4)

使用此查询

$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返回的行数

答案 3 :(得分: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

答案 4 :(得分:0)

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

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

第二个SELECT返回一个数字,表示第一个SELECT的行数 如果没有LIMIT条款,它就会返回。 在最近成功的情况下没有SQL_CALC_FOUND_ROWS选项 SELECT语句,FOUND_ROWS()返回结果集中的行数 由该声明返回。如果该语句包含LIMIT子句,FOUND_ROWS() 返回最多限制的行数。例如,FOUND_ROWS()返回10 如果声明包含LIMIT 10LIMIT 50, 10,则分别为60或

$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

答案 5 :(得分:0)

总记录使用简单:

 $total_records = array_shift(mysql_fetch_row(mysql_query('SELECT FOUND_ROWS()')));

答案 6 :(得分:0)

您必须将mysql.trace_mode设置为off。

在每个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;
?>