- Как определить количество строк в таблице в базе данных MySQL
- Способ 1. phpMyAdmin
- Способ 2. COUNT
- Способ 3. mysql_num_rows
- Смотрите также
- Функция COUNT
- Основные запросы
- Условия выборки
- Группировка
- Сложение строк
- Несколько таблиц
- Длина строк
- Изменение строк
- Поиск по строкам
- Работа с пробелами
- Работа с регистром
- Информация
- Условия
- Полезное
- Разное
- Математические функции
- Списки
- Извлечение части даты
- Получение даты и времени
- Преобразование даты
- Сложение дат
- Тригонометрия
- Отдельные символы
- Системы счисления
- Синтаксис
- Примеры
- Пример
- Пример
- Пример
- Меняем таблицу для примеров
- Пример
- mysqli_result::$num_rows
- Описание
- Список параметров
- Возвращаемые значения
- Примеры
- Смотрите также
- Примечания
- User Contributed Notes 3 notes
- SQL — Урок 8. Группировка записей и функция COUNT()
- Видеоуроки php + mysql
- Подсчёт общего количества строк выборке в mySQL при использовании LIMIT
Как определить количество строк в таблице в базе данных 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. Результаты (не время выборок) для обеих систем одинаковые.
Источник