Как узнать количество записей в sql-выборке

Содержание:

  • HTML
    • Что такое HTML
    • <!DOCTYPE>
    • Мета теги в <head>
    • Тег <base>
    • Текст в html
    • HTML списки
    • Ссылки
    • Картинки на сайте
    • Таблицы
    • Фреймы
    • Формы
    • DHTML
    • Музыка
    • Видео
    • Карты изображений
    • SVG карты
    • Графика в HTML
    • SSI .shtml
    • Таблица цветов RGB
    • Правильноесочетание цветов
    • Таблица«безопасных»цветов
    • Таблица символов
    • Примеры HTML, CSS
  • CSS
    • Таблицы стилей CSS
    • Свод стилей
    • Псевдоклассы CSS
    • Псевдоэлементы CSS
    • CSS-градиент
    • Flexbox
    • Адаптивная верстка
    • @media screen
  • JavaScript
    • Описание языка
    • Методы и функции
    • Объекты
    • Строки
    • Формы
    • Фреймы и окна
    • Регулярныевыражения
    • Условнаякомпиляция
    • Примеры скриптов
    • Отладка
    • Оптимизация
    • Игры на JS
    • CSS из JS
  • PHP + MySQL
    • Введение в PHP
    • Основы языка
    • Использованиемассивов
    • $_server
    • Создание функций
    • Строки
    • Функции работысо строками
    • Объектноепрограммирование
    • Формы
    • Файлы
    • Загрузка файлов на сервер
    • MySQL
      • Дата, время MySQL
      • Вопросы по MySQL
    • Cookie
    • htaccess
    • Безопасность
    • Сессии
    • Отправка почты
    • Кэширование
    • Дата, время
    • Математическиефункции
    • Дополнительныевозможности
    • Регулярныевыражения
    • Библиотека Curl
    • IMAP, POP3, NNTP
    • Оптимизация
    • Примеры скриптов
  • XML + XSLT
  • AJAX
    • Знакомство с Ajax
    • ОбъектXMLHttpRequest
    • СозданиеAjax-приложения
    • Отправка формы
    • Области применения
    • Ajax примеры
    • АльтернативныеAjax-у методы
    • Ошибки Ajax
    • Навигация на AJAX
  • Графика CorelDRAW
    • Типы графики
    • Пакет CorelDRAW GS
    • Зимняя картинка
    • Осколок стекла
  • SEO
    • Анализ сайта
    • WEB продвижение(оптимизация)
    • Информацияо домене
    • Информация обIP-адресе
    • Ping поисковыхсистем
    • Robots.txt
    • meta Robots
    • Каталоги ипоисковики
    • Особенности SAPE
    • Page Rank
    • Сервис созданияссылок
    • О Контекстнойрекламе
  • Сервисы
  • Разное
    • Движки сайтов (CMS)
    • Хостинг
    • Настройка DNS
    • ADSL
    • RSS
    • ActiveX и HTML
    • Паролированиестраницы
    • HTTP коды
    • HTTP протокол
    • HTTP заголовки
    • Прячем ссылки
    • Черный списоксайтов
    • ☭ Заработокв интернете
    • Термины иопределения
    • Продажа доменов
    • НастройкиЯндекс-почты
    • Кнопки социалок
    • Настроки SIPв телефоне
    • Созданиепоискового плугина
    • Сервискоротких ссылок
    • Telegram: бот, ссылки.
    • Друзья
    • Статьи Liex
    • Задания к л/р
    • Примерызачетных задач
  • Статьи, обзоры
    • Шаблоны сайтов
    • Новости

EXPLAIN и индексы.

Здесь без готовой базы (причем заполненной данными — это важно), получить правильную аналитику не получится. Генерить тестовые данные — настолько далеко мой альтруизм не распространяется

Но обычно оптимизация запросов — это отдельный вопрос, который автору велят задавать отдельным постом, включив все запросы, а так же вывод команды, которую надо скопировать 1-в-1 и выполнить в консоли или phpmyadmin


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

Если наугад, чисто из опыта — то в для этого запроса пригодился бы индекс по , а в — по

Эти первые три пункта — главное. С них должна начинаться любая оптимизация и именно они дадут принципиальный прирост производительности, пренебрегать ими нельзя.

Простые SELECT (выбрать) запросы к базе данных MySQL

SELECT1. Выбирает ВСЕ данные в таблице tbl_name.

SELECT * FROM tbl_name;

2. Выведет количество записей в таблице tbl_name.

SELECT count(*) FROM tbl_name;

3. Выбирает (SELECT) из(FROM) таблицы tbl_name лимит (LIMIT) 3 записи, начиная с 2.

SELECT * FROM tbl_name LIMIT 2,3;

4. Выбирает (SELECT) ВСЕ (*) записи из (FROM) таблицы tbl_name и сортирует их (ORDER BY) по полю id по порядку.

SELECT * FROM tbl_name ORDER BY id;

5. Выбирает (SELECT) ВСЕ записи из (FROM) таблицы tbl_name и сортирует их (ORDER BY) по полю id в ОБРАТНОМ порядке.

SELECT * FROM tbl_name ORDER BY id DESC;

6. Выбирает (SELECT) ВСЕ (*) записи из (FROM) таблицы users и сортирует их (ORDER BY) по полю id в порядке возрастания, лимит (LIMIT) первые 5 записей.

SELECT * FROM users ORDER BY id LIMIT 5;

7. Выбирает все записи из таблицы users, где поле fname соответствует значению Gena.

SELECT * FROM users WHERE fname='Gena';

8. Выбирает все записи из таблицы users, где значение поля fname начинается с Ge.

SELECT * FROM users WHERE fname LIKE 'Ge%';

9. Выбирает все записи из таблицы users, где fname заканчивается на na, и упорядочивает записи в порядке возрастания значения id.

SELECT * FROM users WHERE fname LIKE '%na' ORDER BY id;

10. Выбирает все данные из колонок fname, lname из таблице users.

SELECT fname, lname FROM users;

Внимание! Старайтесь указывать конкретные колонки (как в примере 10)

Это важно для того, чтобы запросы обрабатывались намного быстрее!. 11.userscountry

11.userscountry

SELECT DISTINCT country FROM users;

12. Выбирает ВСЕ данные строк из таблицы users где age имеет значения 18,19 и 21.

SELECT * FROM users WHERE age IN (18,19,21);

13.ageusersage

SELECT max(age) FROM users;

14. Выберет данные из таблицы users по полям name и age ГДЕ age принимает самое маленькое значение.

SELECT name, min(age) FROM users;

15. Выберет данные из таблицы users по полю name ГДЕ id НЕ РАВЕН 2.

SELECT name FROM users WHERE id!='2';

Клиентские функции

MySQL API использует структуры данных MYSQL (определены в mysql.h) чтобы установить связь с СУБД. Вы можете устанавливать много соединений из одной программы-клиента, однако, каждое соединений должно быть связано с собственной отдельной структурой MYSQL.

После успешного запроса, если данные должны быть возвращены пользователю, набор результатов должен быть передан через функции mysql_use_result или через функцию mysql_store_result. Обе эти функции сохраняют набор результатов в структуре MYSQL_RES. Разница в том, что mysql_store_result передает весь набор результатов в память клиента, а mysql_use_result инструктирует клиента, чтобы он мог получить строку динамически с сервера с каждым обращением к mysql_fetch_row

Имейте в виду, что mysql_use_result занимает ресурсы сервера, и не должен использоваться для интерактивных прикладных программ, где действия пользователя часто непредсказуемы и могут привести к большим задержкам. Обратите внимание также, что Вы можете держать только одно соединение, которое использует mysql_user_result, открытым, и это должно быть последнее созданное соединение. По умолчанию процесс mysqld закроет соединение после тридцати секунд неактивности

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

Top mysql-num-rows Answerers

All Time

15

hammus 2,52511 gold badge1515 silver badges3434 bronze badges

13

ehudokai 1,8581212 silver badges99 bronze badges

10

Gumbo 569k9999 gold badges723723 silver badges803803 bronze badges

9

cmnardi 87711 gold badge1212 silver badges2222 bronze badges

8

Francois Deschenes 23.4k33 gold badges5959 silver badges5858 bronze badges

7

Eduard7 67866 silver badges1818 bronze badges

6

rid 50.6k2424 gold badges134134 silver badges175175 bronze badges

6

Lightness Races in Orbit 349k6666 gold badges571571 silver badges953953 bronze badges

6

Pekka 406k128128 gold badges905905 silver badges10471047 bronze badges

6

Daniel Vandersluis 79k1717 gold badges153153 silver badges149149 bronze badges

5

SDwarfs 2,97655 gold badges2323 silver badges5151 bronze badges

5

tereško 54.9k2222 gold badges9090 silver badges145145 bronze badges

5

Dirk 2,66711 gold badge3232 silver badges3939 bronze badges

5

Marc B 332k3333 gold badges367367 silver badges452452 bronze badges

5

CristiC 19.7k1010 gold badges5252 silver badges8686 bronze badges

5

Phill Pafford 75k8484 gold badges251251 silver badges375375 bronze badges

5

Michiel Pater 19.5k44 gold badges3737 silver badges5151 bronze badges

5

ircmaxell 151k3333 gold badges252252 silver badges306306 bronze badges

5

codaddict 392k7777 gold badges472472 silver badges507507 bronze badges

4

Gouda Elalfy 6,05111 gold badge1919 silver badges3434 bronze badges

Подготовка

Вы должны подключить файл mysql.h в начале Вашей программы на C:

#include "mysql.h"

Вы также должны компоновать программу с математической (для шифрования) и mysqlclient библиотеками:

$ cc -I/usr/include/mysql -L/usr/lib/mysql myapp.c -o myapp -lm -lmysqlclient

Включаемые файлы обычно размещены в /usr/include/mysql, а библиотеки могут быть найдены в /usr/lib/mysql.

Если Вы имеете утечку памяти в вашей программе-клиенте, Вы можете компилировать с опцией --with-debug=yes. Это заставит код клиента использовать пакет ‘safe_malloc’ в библиотеке клиентов MySQL. Вызовите TERMINATE(stdout) или my_end(1) в вашей прикладной программе-клиенте перед выходом, чтобы получить список всех утечек памяти. Детали — в файле mysys/safemalloc.c из дистрибутива MySQL.

Рассмотрим простой пример MySQL-клиента, который только выполнит SELECT и выведет все возвращенные строки в STDOUT. В нем использованы далеко не все функции С API, он должен только дать Вам представление о типичном виде программы-клиента.

8 ответов

Получение итоговых строк в результате запроса …

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

Это представлено в PHP, например, как функция mysqli_num_rows . Когда вы отредактировали вопрос, упомянув, что используете PHP, вот простой пример использования функций mysqli:

Получить общее количество строк при использовании LIMIT …

Если вы использовали предложение LIMIT, но хотите знать, сколько строк вы получите без него, используйте в своем запросе, а затем SELECT

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


ответ дан Paul Dixon 3 March 2009 в 17:31

Если вам нужно решить проблему с простым SQL, вы можете использовать подзапрос.

ответ дан Marcel Zebrowski 3 March 2009 в 17:31

Если вы хотите получить результат плюс количество возвращаемых строк, сделайте что-то вроде этого. Использование PHP.

ответ дан Robert 3 March 2009 в 17:31

Если в вашем SQL-запросе есть предложение , и вы хотите знать, сколько всего результатов в этом наборе данных, вы можете использовать , а затем . Это возвращает число строк на много больше, чем при использовании Пример (прямо из документов MySQL):

ответ дан Stepan Mazurov 3 March 2009 в 17:31

должен быть вызван сразу после запроса.

ответ дан Quassnoi 3 March 2009 в 17:31

Предполагая, что вы используете функции mysql_ или mysqli_, на ваш вопрос уже должны были ответить другие.

Однако, если вы используете PDO, не существует простой функции, которая возвращает количество строк, извлеченных оператором select, к сожалению. Вы должны использовать count () для набора результатов (обычно после присвоения его локальной переменной).

Или, если вас интересует только число, а не данные, PDOStatement :: fetchColumn () в вашем SELECT COUNT (1) … result.


ответ дан Trevor Bramble 3 March 2009 в 17:31

Так как это 2015, и устарела функциональность , это только визуализация.

Схема для тестирования

Для моей реализации я получаю вывод для обоих выше. Цель вышеупомянутых 2 стратегий состоит в том, чтобы определить, использует ли реализация вашего драйвера rowCount, и если нет, искать запасную стратегию.

ответ дан Drew 3 March 2009 в 17:31

Если вы выбираете данные с помощью WordPress, вы можете получить доступ к количеству строк, возвращенных с помощью $ wpdb-> num_rows:

Если вы хотите конкретный подсчет на основе запроса подсчета mysql, то вы делаете это:

Если вы запускаете обновления или удаляете, то количество затронутых строк возвращается непосредственно из вызова функции:

Это также относится к $ wpdb -> обновить и $ wpdb-> удалить.

ответ дан Dave Hilditch 3 March 2009 в 17:31

PDO

Как говорилось выше и все время говорится на всех сайтах и форумах, надо от от функций mysql переходить к использованию PDO preparеd statements. Это даст сразу ТРИ эффекта:

  1. пропадут любые ошибки, вызванные неверными данными.
  2. SQL-инъекции окажутся на свалке истории*)
  3. (о чем чаще всего не знают) множество рутинных операций станут выполняться проще и меньшим количеством кода.

Главное правило при работе с PDO — все запросы, в которых используются какие-либо переменные, должны выполняться строго через prepare()/execute(), а вместо переменных в запрос должны вставляться пейсхолдеры:


в результате мы получим массив вида который очень удобно потом вывести в шаблоне:

PS. Вот меня часто ругают за то отношение, которое я высказываю по отношению к сообществу пхп в целом, и к тем его представителям, которые отвечают на вопроса на SO.

Ну скажите, какое может быть отношение, если три ответа, из которых

  • один переливает из пустого в порожнее: спросив, не ip ли v4 хранится в базе (как будто в варчар(15) можно запихнуть ipv6), потом, когда читатель ждёт уж рифмы «INT»… предлагает тот же варчар, только в профиль. Плюс немасштабируемый IN. Плюс куча мелкой непринципиальной косметики, причем не видно различия между действительно важными вещами и мелочевкой.
  • а другие два смогли-таки в джойн, но груп бай уже не осилили.

Мелкие оптимизации

Идея сократить размер данных в таблице — здравая. В первую очередь она касается самого IPv4 адреса, который представляет из себя ничто иное, как обычный 4-байтовый int. И может храниться в колонке соответствующего типа. Для конвертации в mysql есть функции и .Разумеется, никаких проблем с WHERE эти функции не создают. Ну, то есть, если самому не тупить и не писать , применяя функцию к каждой записи в таблице. Применять её надо к константе, оставляя поле как есть:

и индекс будет работать прекрасно.

Также можно вместо слов писать в статусы цифры, и таким образом сократить размер всей записи до 16 байт!

Top mysql-num-rows Askers

All Time

7

indian 7511 gold badge11 silver badge55 bronze badges

7

David Rhoden 79533 gold badges1313 silver badges2828 bronze badges

6

totallyNotLizards 7,75388 gold badges4646 silver badges8282 bronze badges

5

Corey 31755 silver badges1515 bronze badges

5

Oliver Spryn 15k3030 gold badges8888 silver badges179179 bronze badges

4

Sokhrat Sikar 17511 gold badge44 silver badges1414 bronze badges

3

GeekWithGlasses 5131111 silver badges2424 bronze badges

3

brocksprogramming 7499 bronze badges

2

Jeffrey van Zwam 751212 bronze badges

2

loader 2555 bronze badges

2

wesslayneb 4711 gold badge11 silver badge77 bronze badges

2

bluefiredragon 4555 bronze badges

2

elzaer 69777 silver badges2424 bronze badges

2

Hector James Haddow 11933 silver badges1111 bronze badges

2

dje1990 3599 bronze badges

2

Kishor 1,53122 gold badges1414 silver badges2323 bronze badges

2

hairynuggets 2,8611919 gold badges5151 silver badges8686 bronze badges

2

Oseer 70077 gold badges1616 silver badges2828 bronze badges

2

Kaizokupuffball 2,07955 gold badges2424 silver badges4141 bronze badges

2

tee 15522 gold badges66 silver badges1212 bronze badges

Only non community-wiki questions and answers are included in these totals (updated daily)


С этим читают