#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, результат сохраняется в переменной, затем он используется в другом запросе.
Дайте мне знать, если вам нужен пример любого из этих