2012-04-10 4 views
9

Been следующих примеров из here и многих других сайтов, но не получить ожидаемые результатыПолучить общее количество строк при использовании LIMIT

SNIPPET моего PHP код;

$query="SELECT * FROM book"; 
$result=mysql_query($query); 
echo mysql_num_rows($result); //returns 14 


$query="SELECT FOUND_ROWS()"; 
$rtotal=mysql_query($query); 
echo mysql_result($rtotal,0); //returns 14 


$query="SELECT * FROM book LIMIT 0,4"; 
$result=mysql_query($query); 
echo mysql_num_rows($result); //returns 4 


$query="SELECT FOUND_ROWS()"; 
$rtotal=mysql_query($query); 
echo mysql_result($rtotal,0); //returns 4 Why is it 4 and not 14?? 

В последнем примере, почему это 4, а не 14? Что я делаю не так?

ответ

18

Добавить SQL_CALC_FOUND_ROWS к вашему отборному заявлению: http://dev.mysql.com/doc/refman/5.5/en/information-functions.html#function_found-rows

Это заставляет MySQL для подсчета строк, если предельное утверждение нет.

$query="SELECT SQL_CALC_FOUND_ROWS * FROM book LIMIT 0,4"; 
+0

Обратите внимание, что это необходимо добавить к третьему запросу. – alexn

+0

спасибо !! и это было даже упомянуто в блоге, который я читал, так или иначе я пропустил его полностью – user6890

2

Ваш последний запрос возвратил 4 строки ($query="SELECT * FROM book LIMIT 0,4";).

Вот почему она возвращает 4, а не 14.


Процитирует документацию:

При отсутствии опции SQL_CALC_FOUND_ROWS в последнем успешном ЗЕЬЕСТЕ, FOUND_ROWS() возвращает количество строк в результирующем наборе, возвращаемое этим оператором. Если оператор включает предложение LIMIT, FOUND_ROWS() возвращает количество строк до предела.

+1

Неправильно. FOUND_ROWS возвращает количество строк, которые были бы возвращены предыдущим запросом, если не было установлено ограничение. http://dev.mysql.com/doc/refman/5.5/enformation-functions.html#function_found-rows – alexn

+1

@alexn: Это не так, см. документацию (цитируется выше). Но чтобы он работал должным образом, необходимо добавить SQL_CALC_FOUND_ROWS'. –

+2

Теперь, когда вы отредактировали свой ответ, это правильно. Вы заявили, что это не сработало, поскольку он использовал предел в предыдущем запросе. Я удаляю свой downvote, если ваш ответ будет отредактирован. – alexn