Sql подсчет строк php

Все способы, как определить количество строк в MySQL

От автора: один мой знакомый утверждает, что Дед Мороз существует. В него он поверил после того, как его младшему сыну на Новый Год подарили 10 кг шоколадных конфет. Теперь на следующий год придется у Деда Мороза просить пломбы для всех членов семьи! К счастью в веб-программировании можно перестраховаться от таких неожиданностей, и определить количество строк в MySQL заранее.

Зачем знать сколько?

Любая таблица состоит из столбцов и строк. Объем хранящихся в базе данных зависит от того, сколько строк содержится в каждой ее таблице.

Подобно тому, как число дырок в зубах человека зависит от съеденного ранее объема конфет. Точнее, от общего веса сладостей, которым «одарили» вашего ребенка на Новый Год :).

Понятно, что от большого числа строк в базе MySQL пломб во рту не прибавится, но все же знание этого параметра может понадобиться при оптимизации работы вашего сайта, для запуска некоторых скриптов и т.д.

Легко!

Для получения в MySQL количества строк не обязательно «кумекать» в составлении SQL-запросов. Достаточно просто открыть в программной оболочке нужную таблицу и посмотреть id последней строки. Именно этот столбец чаще всего используют в качестве уникального ключа, и его значение генерируется автоматически (автоинкремент) путем приращения единицы(+1) к предыдущему.

Онлайн курс «PHP-разработчик»

Изучите курс и создайте полноценный проект — облачное хранилище файлов

Читайте также:  Python windows path directory

С нуля освоите язык программирования PHP, структурируете имеющиеся знания, а эксперты помогут разобраться с трудными для понимания темами, попрактикуетесь на реальных задачах. Напишете первый проект для портфолио.

Чтобы доказать эту «аксиому», откроем в phpMyAdmin таблицу любой БД. Например, таблицу animal. Как видно на скриншоте, значение столбца id идет по порядку, от 1 до.… Так, отставить! А куда убежал котяра с «идентификационным номером» 4? Наверное, опять «собачек» под номерами 5 и 6 испугался 🙂

В этой базе MySQL количество строк в таблице можно просто посчитать «на пальцах». Но что делать, если в таблице не 7 строк, а несколько сотен? Например, как в этой.

И это лишь одна из восьми страниц выборки. На самом деле число записей может исчисляться не только сотнями, но и тысячами. Вдобавок здесь нет столбца id, потому что он не является обязательным. Его наличие зависит от структуры всей БД, поскольку в ней значения всех строк взаимосвязаны между собой. Получается, что описанный выше метод подсчета строк MySQL не всегда действует.

Несколько правильных методов

Как говорится, первый метод «комом», поэтому рассмотрим несколько более эффективных и менее «простых» способов:

Функция COUNT() – возвращает число строк. Является встроенной функцией SQL. Все таки давайте узнаем, количество записей большой таблицы из БД, скриншот которой приведен выше. Код запроса:

Оказывается в таблице country целых 239 записей! Понятно, что для их подсчета не хватит пальцев ни на руках, ни на ногах (если не использовать конечности других людей или животных)). Как видите, этот способ в MySQL подсчета количества строк работает намного точнее и чаще всего используется профессионалами.

Но эта функция умеет не только это! Например, с ее помощью можно узнать, сколько из «представленных» в БД стран находятся в Европе:

А еще, сколько раз каждая страна упоминается в таблице. Пример запроса:

С помощью этого запроса мы узнали количество строк в MySQL, в которых упоминается каждая из стран. Из результатов его выполнения видно, что по одному разу.

Чуть не забыл! Если у вас еще нет в наличии базы world, с которой мы сегодня работаем, то ее можно скачать по этой ссылке с официального сайта разработчиков СУБД MySQL. После скачивания архив с ней нужно разархивировать и затем импортировать не сервер БД. В phpMyAdmin это можно сделать через пункт основного меню «Импорт».

Более подробно об этой процедуре я рассказывал в одном из предыдущих материалов.

Функция MAX() – в некоторых случаях она также позволяет в MySQL узнать количество строк в таблице. Почему иногда? Сейчас объясню. Помните первый способ подсчета, который мы рассмотрели в начале. Он подразумевает, что самое большое значение столбца id равно числу записей. Применение данной функции является своего рода «автоматизацией» того метода. MAX() возвращает максимальное значение указанного столбца (id). Для тестирования функции мы будет использовать таблицу city, которая также входит в состав базы world. Код запроса:

Источник

mysqli_num_rows

The behaviour of mysqli_num_rows() depends on whether buffered or unbuffered result sets are being used. This function returns 0 for unbuffered result sets unless all rows have been fetched from the server.

Parameters

Return Values

An int representing the number of fetched rows. Returns 0 in unbuffered mode unless all rows have been fetched from the server.

Note:

If the number of rows is greater than PHP_INT_MAX , the number will be returned as a string .

Examples

Example #1 Object-oriented style

mysqli_report ( MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT );
$mysqli = new mysqli ( «localhost» , «my_user» , «my_password» , «world» );

$result = $mysqli -> query ( «SELECT Code, Name FROM Country ORDER BY Name» );

/* Get the number of rows in the result set */
$row_cnt = $result -> num_rows ;

printf ( «Result set has %d rows.\n» , $row_cnt );

Example #2 Procedural style

mysqli_report ( MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT );
$link = mysqli_connect ( «localhost» , «my_user» , «my_password» , «world» );

$result = mysqli_query ( $link , «SELECT Code, Name FROM Country ORDER BY Name» );

/* Get the number of rows in the result set */
$row_cnt = mysqli_num_rows ( $result );

printf ( «Result set has %d rows.\n» , $row_cnt );

The above examples will output:

Notes

Note:

In contrast to the mysqli_stmt_num_rows() function, this function doesn’t have object-oriented method variant. In the object-oriented style, use the getter property.

See Also

  • mysqli_affected_rows() — Gets the number of affected rows in a previous MySQL operation
  • mysqli_store_result() — Transfers a result set from the last query
  • mysqli_use_result() — Initiate a result set retrieval
  • mysqli_query() — Performs a query on the database
  • mysqli_stmt_num_rows() — Returns the number of rows fetched from the server

User Contributed Notes 3 notes

If you have problems making work this num_rows, you have to declare ->store_result() first.

$mysqli = new mysqli ( «localhost» , «root» , «» , «tables» );

$query = $mysqli -> prepare ( «SELECT * FROM table1» );
$query -> execute ();
$query -> store_result ();

This function doesn’t work with LIMIT used jointly with SQL_CALC_FOUND_ROWS. If you want to obtain the total rows found you must do it manually, example:

public function errorList ( int $limit = 25 , int $offset = 0 ) $errorList = array();
$result = $this -> con -> query ( «SELECT SQL_CALC_FOUND_ROWS id, erreur FROM Erreurs ORDER BY id DESC LIMIT $limit OFFSET $offset » );
while( $row = $result -> fetch_assoc ()) $errorList [] = new Erreur ( $row );
>
$result -> free ();
// $foundRows = $result->num_rows; // 25
$foundRows = $this -> con -> query ( «SELECT FOUND_ROWS() as foundRows» );
$this -> foundRows = $foundRows -> fetch_assoc (); // 178
return $errorList ;
>
?>

in php 5.3.8 had unexpected troubles when checking for mysqli_result::$num_rows
If the result of the query is empty then var_dump of the result will be like this:
class mysqli_result#5 (5) public $current_field => NULL
public $field_count => NULL
public $lengths => NULL
public $num_rows => NULL
public $type => NULL
>
but var_dump($result->num_rows) will give integer-typed zero instead of NULL:
int(0)

Источник

mysqli_stmt_num_rows

Возвращает количество строк, помещённых в буфер в выражении. Функция будет работать только после вызова mysqli_stmt_store_result() для буферизации всего набора результатов в дескрипторе оператора.

Функция возвращает 0 , если с сервера не были получены все строки.

Список параметров

Только для процедурного стиля: объект mysqli_stmt , полученный с помощью mysqli_stmt_init() .

Возвращаемые значения

Целое число ( int ), представляющее количество буферизованных строк. Возвращает 0 в небуферизованном режиме, если с сервера не были получены все строки.

Замечание:

Если количество строк больше, чем PHP_INT_MAX , число будет возвращено как строка ( string ).

Примеры

Пример #1 Объектно-ориентированный стиль

mysqli_report ( MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT );
$mysqli = new mysqli ( «localhost» , «my_user» , «my_password» , «world» );

$query = «SELECT Name, CountryCode FROM City ORDER BY Name LIMIT 20» ;
$stmt = $mysqli -> prepare ( $query );
$stmt -> execute ();

/* сохранение результата во внутреннем буфере */
$stmt -> store_result ();

printf ( «Число строк: %d.\n» , $stmt -> num_rows );

Пример #2 Процедурный стиль

mysqli_report ( MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT );
$link = mysqli_connect ( «localhost» , «my_user» , «my_password» , «world» );

$query = «SELECT Name, CountryCode FROM City ORDER BY Name LIMIT 20» ;
$stmt = mysqli_prepare ( $link , $query );
mysqli_stmt_execute ( $stmt );

/* сохранение результата во внутреннем буфере */
mysqli_stmt_store_result ( $stmt );

printf ( «Число строк: %d.\n» , mysqli_stmt_num_rows ( $stmt ));

Результат выполнения данных примеров:

Смотрите также

  • mysqli_stmt_store_result() — Сохраняет набор результатов во внутреннем буфере
  • mysqli_stmt_affected_rows() — Возвращает общее количество строк, изменённых, удалённых, вставленных или сопоставленных последним выполненным выражением
  • mysqli_prepare() — Подготавливает SQL выражение к выполнению

User Contributed Notes 1 note

Please be advised, for people who sometimes miss to read this important Manual entry for this function:

If you do not use mysqli_stmt_store_result( ), and immediatley call this function after executing a prepared statement, this function will usually return 0 as it has no way to know how many rows are in the result set as the result set is not saved in memory yet.

mysqli_stmt_store_result( ) saves the result set in memory thus you can immedietly use this function after you both execute the statement AND save the result set.

If you do not save the result set but still want to use this function you have to actually loop through the result set one row at a time using mysqli_stmt_fetch( ) before using this function to determine the number of rows.

A thought though, if you want to determine the number of rows without storing the result set and after looping through it, why not just simply keep an internal counter in your loop every time a row is fetched and save the function call.

In short, this function is only really useful if you save the result set and want to determine the number of rows before looping through it, otherwise you can pretty much recreate its use like I suggested.

Источник

Оцените статью