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);
答案 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_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
返回一个数字,表示第一个SELECT
的行数
如果没有LIMIT
条款,它就会返回。
在最近成功的情况下没有SQL_CALC_FOUND_ROWS
选项
SELECT
语句,FOUND_ROWS()
返回结果集中的行数
由该声明返回。如果该语句包含LIMIT
子句,FOUND_ROWS()
返回最多限制的行数。例如,FOUND_ROWS()
返回10
如果声明包含LIMIT 10
或LIMIT 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;
?>