Как получить количество строк в одном запросе?

#mysql

#mysql

Вопрос:

Допустим, у меня есть запрос черного ящика, который я не совсем понимаю, как он работает, что-то вроде:

SELECT ... FROM ... JOIN ... = A (denoted as A)

Допустим, A возвращает 500 строк.

Я хочу получить количество строк (в данном случае 500), а затем возвращать только ограничение в 50. Как я могу написать запрос, построенный вокруг A , который вернул бы число ‘500’ и 50 строк данных?

Комментарии:

1. Вам нужно каким-то образом переписать запрос как SELECT COUNT(...) . Вы могли бы даже попробовать SELECT COUNT(*) FROM (SELECT ...) AS subselect .

2. LIMIT offset, limit

Ответ №1:

Вы можете использовать оконные функции (доступные только в MySQL 8.0) и предложение, ограничивающее строки:

 select a.*, count(*) over() total_rows
from ( < your query >) a
order by ??
limit 50
  

Обратите внимание, что я добавил order by предложение к запросу. Хотя технически это не требуется, это лучшая практика: без order by предложения, в котором столбец (или набор столбцов) однозначно идентифицирует каждую строку, не определено, какие 50 строк вернет база данных, и результаты могут не совпадать при последовательном выполнении одного и того же запроса.

Ответ №2:

Это то, что SELECT SQL_CALC_FOUND_ROWS предназначено для выполнения.

 SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10;

SELECT FOUND_ROWS();
  

Первый запрос возвращает ограниченный набор строк.

Второй запрос вызывает FOUND_ROWS() , который возвращает целое число того, сколько строк соответствовало самому последнему запросу, количество строк, которые были бы возвращены, если бы этот запрос не использовался LIMIT .

Смотрите https://dev.mysql.com/doc/refman/8.0/en/information-functions.html#function_found-rows

Однако имейте в виду, что использование SQL_CALC_FOUND_ROWS влечет за собой значительные затраты на производительность. Тесты показывают, что обычно быстрее просто выполнить два запроса:

 SELECT COUNT(*) FROM tbl_name WHERE id > 100; -- the count of matching rows

SELECT * FROM tbl_name WHERE id > 100 LIMIT 10; -- the limited result
  

Смотрите https://www.percona.com/blog/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows /

Ответ №3:

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

Дайте мне знать, если вам нужен пример любого из этих