2013-02-13 306 views
3

SELECT FOUND_ROWS()不工作或返回1,我不知道我哪裏錯SELECT FOUND_ROWS()在MySQL返回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

你想知道總記錄? – 2013-02-13 06:12:09

+0

先生這不是我的解決方案PLZ建議最好的一個忘了舊/新等 – okconfused 2013-02-13 06:12:42

+0

是的Devang Rathod,但通過使用選擇找到的行 – okconfused 2013-02-13 06:13:24

回答

3

使用此查詢

$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

4

A SELECT statement may inc lude a LIMIT子句來限制服務器返回給客戶端的行數。在某些情況下,需要知道語句在沒有LIMIT的情況下會返回多少行,但不需要再次運行語句。要獲得此行計數,包括在SELECT語句SQL_CALC_FOUND_ROWS選項,然後調用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

+0

thankx先生。 Varun我得到了我的答案 – okconfused 2013-02-13 06:25:39

+0

如果這篇文章幫助你請標記爲幫助其他觀衆的答案。 – Varun 2013-02-13 10:54:56

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

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條款被寫入。 如果最近成功的 SELECT語句中缺少SQL_CALC_FOUND_ROWS選項,FOUND_ROWS()將返回該語句返回的結果集 中的行數。如果聲明包含LIMIT子句,FOUND_ROWS() 返回達到限制的行數。例如,如果語句包括LIMIT 10LIMIT 50, 10,則FOUND_ROWS()分別返回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 
0

對於總記錄使用簡單:

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

接受的答案似乎是錯誤的。因爲它建議在帶有LIMIT的查詢之後使用found_rows()。

答案:問題是關於RETURN 1,在某些情況下,作爲found_rows()的結果0的問題;

當您的第一個選擇語句後執行一些其他查詢時,會發生這種情況。 尤其是當您使用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(); 

我們得到這個會被詢問時,我們從sometable_name運行 SELECT *返回的行數; ie:沒有限制。

話說回來,

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

會給我們的結果的總數,其中限制的COS將< = 10。並沒有服務於任何實際目的,但這不是一個錯誤。

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