Вывести количество строк mysql

Как определить количество строк в таблице в базе данных MySQL

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

Способ 1. phpMyAdmin

Начнем с самого простого и очевидного. Допустим, вам не нужно использовать полученный результат в коде, а просто узнать количество строк, только и всего.

Тогда заходим в phpMyAdmin (localhost/tools/phpmyadmin — для Денвера, localhost/phpMyAdmin для MAMP), затем выбираем нужную базу данных, после этого выбираем таблицу, количество строк в которой нужно выяснить, и видим следующее сообщение:

Способ 2. COUNT

Вот так выглядит сам SQL-запрос:

SQL-запрос с условием:

Реализация на PHP:

Аналогичным образом сюда можно добавить условие. Тогда код выведет число строк в таблице, удовлетворяющих условию.

Способ 3. mysql_num_rows

Этот способ позволяет подсчитать количество строк результата запроса.

Например в WordPress посты хранятся в таблице wp_posts , таким образом мы можем узнать сколько записей (типов постов) хранится в базе данных в таблице MySQL. Этот код дан только для примера (или для случаев, когда среда WordPress не подгружена), так как в WordPress подключение к базе данных осуществляется через класс $wpdb.

В результат будут включены абсолютно все записи. А как узнать количество только тех, которые опубликованы? Для этого нам потребуется немного изменить SQL-запрос.

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

Впервые познакомился с WordPress в 2009 году. Организатор и спикер на конференциях WordCamp. Преподаватель в школе Нетология.

Если вам нужна помощь с сайтом или разработка с нуля на WordPress / WooCommerce — пишите. Я и моя команда будем рады вам помочь!

Источник

Функция COUNT

Основные запросы

Условия выборки

Группировка

Сложение строк

Несколько таблиц

Длина строк

Изменение строк

Поиск по строкам

Работа с пробелами

Работа с регистром

Информация

Условия

Полезное

Разное

  • Типы полей
  • Организация базы данных
    создание правильной структуры —>
  • Подзапросы
  • SELECT @min_price:=MIN(price),@max_price:=MAX(price) FROM shop; mysql> SELECT * FROM shop WHERE price=@min_price OR price=@max_price; https://habrahabr.ru/post/133781/ тут еще про переменные цикл получается SET @i = 0; SELECT * FROM product WHERE MOD(@i:=@i+1, 2) = 0; —>Переменные sql

Математические функции

Списки

Извлечение части даты

Получение даты и времени

Преобразование даты

Сложение дат

Тригонометрия

Отдельные символы

Системы счисления

Функция COUNT подсчитывает количество записей в таблице.

Условие, по которому будут выбираться записи, задается с помощью команды WHERE.

Команда WHERE не является обязательной, если ее не указать — будут подсчитаны все записи в таблице.

См. также команду DISTINCT, которая позволяет подсчитывать только уникальные значения поля.

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

Синтаксис

Подсчет всех записей:

Подсчет всех записей, где заданное поле не равно NULL:

Только уникальные значения поля:

Примеры

Все примеры будут по этой таблице workers, если не сказано иное:

id
айди
name
имя
age
возраст
salary
зарплата
1 Дима 23 400
2 Петя 25 500
3 Вася 23 500
4 Коля 30 1000
5 Иван 27 500
6 Кирилл 28 1000

Пример

Давайте подсчитаем всех работников с возрастом 23 года:

Результат выполнения SQL запроса:

count
результат подсчета
2

Пример

Давайте подсчитаем количество разных зарплат (их будет 3 штуки: 400, 500 и 1000):

Результат выполнения SQL запроса:

count
результат подсчета
3

Пример

Давайте подсчитаем одновременно количество разных возрастов и количество разных зарплат:

Результат выполнения SQL запроса:

count1
количество возрастов
count2
количество зарплат
5 3

Меняем таблицу для примеров

Все примеры ниже будут по этой таблице workers, если не сказано иное:

id
айди
name
имя
age
возраст
salary
зарплата
1 Дима 23 NULL
2 Петя 25 500
3 Вася 23 NULL

Пример

Давайте подсчитаем количество всех записей:

Результат выполнения SQL запроса:

count
результат подсчета
3

А теперь подсчитаем количество зарплат, не равных NULL:

Источник

mysqli_result::$num_rows

(PHP 5, PHP 7, PHP 8)

mysqli_result::$num_rows — mysqli_num_rows — Получает количество строк в наборе результатов

Описание

Возвращает число рядов в результирующей выборке.

Поведение функции mysqli_num_rows() зависит от того, используется ли буферизованная или не буферизованная результирующая выборка. Функция возвращает 0 для небуферизованных наборов результатов, если с сервера не были получены все строки.

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

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

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

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

Примеры

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

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

/* Получение количества строк в наборе результатов */
$row_cnt = $result -> num_rows ;

printf ( «Получено %d строк.\n» , $row_cnt );
?>

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

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

/* Получение количества строк в наборе результатов */
$row_cnt = mysqli_num_rows ( $result );

printf ( «Получено %d строк.\n» , $row_cnt );

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

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

  • mysqli_affected_rows() — Получает число строк, затронутых предыдущей операцией MySQL
  • mysqli_store_result() — Передаёт на клиента результирующий набор последнего запроса
  • mysqli_use_result() — Готовит результирующий набор на сервере к использованию
  • mysqli_query() — Выполняет запрос к базе данных
  • mysqli_stmt_num_rows() — Возвращает количество строк, полученных с сервера

Примечания

В отличие от функции mysqli_stmt_num_rows() , у этой функции нет варианта в объектно-ориентированном стиле. В объектно-ориентированном стиле используйте метод чтения.

User Contributed Notes 3 notes

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

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

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

$rows = $query -> num_rows ;

// Return 4 for example
?>

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

Источник

SQL — Урок 8. Группировка записей и функция COUNT()

Давайте вспомним, какие сообщения и в каких темах у нас имеются. Для этого можно воспользоваться привычным запросом:

А что, если нам надо лишь узнать сколько сообщений на форуме имеется. Для этого можно воспользоваться встроенной функцией COUNT(). Эта функция подсчитывает число строк. Причем, если в качестве аргумента этой функции выступает *, то подсчитываются все строки таблицы. А если в качестве аргумента указывается имя столбца, то подсчитываются только те строки, которые имеют значение в указанном столбце.

В нашем примере оба аргумента дадут одинаковый результат, т.к. все столбцы таблицы имеют тип NOT NULL. Давайте напишем запрос, используя в качестве аргумента столбец id_topic:

Итак, в наших темах имеется 4 сообщения. Но что, если мы хотим узнать сколько сообщений имеется в каждой теме. Для этого нам понадобится сгруппировать наши сообщения по темам и вычислить для каждой группы количество сообщений. Для группировки в SQL используется оператор GROUP BY. Наш запрос теперь будет выглядеть так:

Оператор GROUP BY указывает СУБД сгруппировать данные по столбцу id_topic (т.е. каждая тема — отдельная группа) и для каждой группы подсчитать количество строк:

Ну вот, в теме с у нас 3 сообщения, а с — одно. Кстати, если бы в поле id_topic были возможны отсутствия значений, то такие строки были бы объединены в отдельную группу со значением NULL.

Предположим, что нас интересуют только те группы, в которых больше двух сообщений. В обычном запросе мы указали бы условие с помощью оператора WHERE, но этот оператор умеет работать только со строками, а для групп те же функции выполняет оператор HAVING:

В результате имеем:

В уроке 4 мы рассматривали, какие условия можно задавать оператором WHERE, те же условия можно задавать и оператором HAVING, только надо запомнить, что WHERE фильтрует строки, а HAVING — группы.

Итак, сегодня мы узнали, как создавать группы и как подсчитать количество строк в таблице и в группах. Вообще вместе с оператором GROUP BY можно использовать и другие встроенные функции, но их мы будем изучать позже.

Видеоуроки php + mysql

Если этот сайт оказался вам полезен, пожалуйста, посмотрите другие наши статьи и разделы.

Источник

Подсчёт общего количества строк выборке в mySQL при использовании LIMIT

Один хороший человек хочет попасть на хабр. Для подтверждения своих благих намерений он написал статью, которую я привожу вам.

Наверняка многие знают о существовании в mySQL функции FOUND_ROWS(). Её чаще всего используют для подсчета общего числа строк в таблице, удовлетворяющих заданным условиям. Используют её обычно совместно с директивой SQL_CALC_FOUND_ROWS следующим образом:

Mysql> SELECT SQL_CALC_FOUND_ROWS * FROM table WHERE column > 1 LIMIT 0, 50;
Mysql> SELECT FOUND_ROWS();

Результатом второго запроса будет общее количество строк в таблице «table», удовлетворяющих условию «column > 1» (а не только тех, что были возвращены первым запросом).
Следует учитывать некоторые особенности этой функции, когда используете её без директивы SQL_CALC_FOUND_ROWS, о чём добросовестно предупреждает документация mySQL: в этом случае она вернёт общее количество обработанных строк (не возвращённых!). Например:

Mysql> SELECT * FROM table LIMIT 0, 50;
Mysql> SELECT FOUND_ROWS();

Результатом, как и ожидается, будет «50». Но следующие запросы вернут не слишком ожидаемый результат:

Mysql> SELECT * FROM table WHERE column > 1 LIMIT 50, 50;
Mysql> SELECT FOUND_ROWS();

Несмотря на то, что первый запрос вернёт 50 строк, результатом будет «100», т.к. mySQL пришлось просмотреть именно 100 строк.

Кроме того, при использовании UNION с SQL_CALC_FOUND_ROWS также появляются некоторые специфические требования:

  • директива SQL_CALC_FOUND_ROWS должна появляться единственный раз и только в первом запросе;
  • точные результаты возвращаются только при использовании UNION ALL, т.к. при использовании UNION без ALL некоторые строки будут удалены, что не учитывается функцией FOUND_ROWS();
  • если не используется глобальный LIMIT, то директива SQL_CALC_FOUND_ROWS без проигнорирована.

Документация mySQL прямо рекомендует использовать данную функцию для подсчёта общего количества строк в таблице, удовлетворяющих параметрам запроса (например, при разбивки какого-либо списка на страницы), утверждая, что это быстрее, чем два классически используемых запроса вроде:

Mysql> SELECT * FROM table WHERE column > 1 LIMIT 50, 50;
Mysql> SELECT COUNT(*) FROM table WHERE column > 1;

Вопрос: если вариант с использованием функции FOUND_ROWS() действительно быстрее, то почему его не используют повсеместно? Я решил сравнить оба подхода. Для этого была создана таблица:

CREATE TABLE `table_1` (
`id` int (10) unsigned NOT NULL auto_increment,
`column_1` varchar (32) default NULL ,
`column_2` varchar (32) default NULL ,
PRIMARY KEY (`id`),
KEY `column_2` (`column_2`)
) ENGINE=MyISAM AUTO_INCREMENT=1;

* This source code was highlighted with Source Code Highlighter .

Таблица содержит три колонки: числовое поле id с auto_increment и PRIMARY-ключом; текстовую колонку column_1 без индекса и текстовую же колонку с индексом column_2. Таблица была заполнена с помощью следующего PHP-скрипта:

for ($i = 0; $i insert ( ‘table_1’ , array ( ‘column_1’ , ‘column_2’ ), array ( md5(uniqid(rand(), true )), md5(uniqid(rand(), true )) ) );
>
?>

* This source code was highlighted with Source Code Highlighter .

$db – это обёртка над PHP-функциями по работе с mySQL. В ней в частности проводится замер времени исполнения запросов к БД.
Далее производились следующие виды выборок:

  • «Стандартный» запрос c выборкой по PRIMARY-ключу
    SELECT * FROM `table_1` WHERE `id`
    SELECT COUNT(*) FROM `table_1` WHERE `id`
  • SQL_CALC_FOUND_ROWS c выборкой по PRIMARY ключу:
    SELECT SQL_CALC_FOUND_ROWS * FROM `table_1` WHERE `id`
    SELECT FOUND_ROWS() AS count
  • «Стандартный» запрос c выборкой по колонке БЕЗ КЛЮЧА
    SELECT * FROM `table_1` WHERE `column_1` LIKE ‘$column_1_limit%’ LIMIT 1000
    SELECT COUNT(*) FROM `table_1` WHERE `column_1` LIKE ‘$column_1_limit%’
  • SQL_CALC_FOUND_ROWS c выборкой по колонке БЕЗ КЛЮЧА
    SELECT SQL_CALC_FOUND_ROWS * FROM `table_1` WHERE `column_1` LIKE ‘$column_1_limit%’ LIMIT 1000
    SELECT FOUND_ROWS() AS count
  • «Стандартный» запрос c выборкой по колонке VARCHAR с КЛЮЧОМ
    SELECT * FROM `table_1` WHERE `column_2` LIKE ‘$column_2_limit%’ LIMIT 1000
    SELECT COUNT(*) FROM `table_1` WHERE `column_2` LIKE ‘$column_2_limit%’
  • SQL_CALC_FOUND_ROWS c выборкой по колонке БЕЗ КЛЮЧА
    SELECT SQL_CALC_FOUND_ROWS * FROM `table_1` WHERE `column_2` LIKE ‘$column_2_limit%’ LIMIT 1000
    SELECT FOUND_ROWS() AS count
  • «Стандартный» запрос c выборкой по обеим колонкам
    SELECT * FROM `table_1` WHERE `column_1` LIKE ‘$column_1_limit_2%’ AND `column_2` LIKE ‘$column_2_limit_2%’ LIMIT 1000
    SELECT COUNT(*) FROM `table_1` WHERE `column_1` LIKE ‘$column_1_limit_2%’ AND `column_2` LIKE ‘$column_2_limit_2%’
  • SQL_CALC_FOUND_ROWS c выборкой по обеим колонкам
    SELECT SQL_CALC_FOUND_ROWS * FROM `table_1` WHERE `column_1` LIKE ‘$column_1_limit_2%’ AND `column_2` LIKE ‘$column_2_limit_2%’ LIMIT 1000
    SELECT FOUND_ROWS() AS count
  • «Стандартный» запрос c выборкой по обеим колонкам + PRIMARY
    SELECT * FROM `table_1` WHERE `column_1` LIKE ‘$column_1_limit_3%’ AND `column_2` LIKE ‘$column_2_limit_3%’ AND `id`
    SELECT COUNT(*) FROM `table_1` WHERE `column_1` LIKE ‘$column_1_limit_3%’ AND `column_2` LIKE ‘$column_2_limit_3%’ AND `id`
  • SQL_CALC_FOUND_ROWS c выборкой по обеим колонкам + PRIMARY
    SELECT SQL_CALC_FOUND_ROWS * FROM `table_1` WHERE `column_1` LIKE ‘$column_1_limit_3%’ AND `column_2` LIKE ‘$column_2_limit_3%’ AND `id`
    SELECT FOUND_ROWS() AS count

Каждый из запросов исполнялся 10 раз с разными параметрами, при этом параметры у «Стандартного» и SQL_CALC_FOUND_ROWS запроса одного типа на одной итерации – одинаковые. Т.е.:

for ($i = 0; $i // НИЖЕ – ИСПОЛНЕНИЕ ЗАПРОСОВ
>

* This source code was highlighted with Source Code Highlighter .

Результаты тестирования можно увидеть на диаграмме:

Получается, что всё не так однозначно, как говориться в документации mySQL. При использовании выборки по колонкам с индексам однозначно быстрее «классическая» схема. При использовании же колонок без индексов, а также смешанных запросов, быстрее становится функция FOUND_ROWS(), однако её выигрыш весьма незначителен.
Таким образом, выбор подхода – дело каждого конкретного случая. Когда производительность не имеет особого значения и важны удобство и скорость написания кода, то вполне можно использовать FOUND_ROWS() + SQL_CALC_FOUND_ROWS. В противном случае, видимо, предпочтительнее использовать классическую схему из двух запросов.
Тестирование проводилось на двух машинах:

  • Windows XP SP3, Intel Pentium Core 2 Duo E8300 @ 2.83 GHz, 2 GB, mySQL 5.0.51a
  • Ubuntu 8.04, AMD Opteron 2344 HE Quad-Core, 4 GB, 5.0.51a-3ubuntu5.4

Диаграмма показывает результаты в Windows XP. Результаты (не время выборок) для обеих систем одинаковые.

Источник

Читайте также:  Как отмыть сливу с футболки
Оцените статью