получить общий лимит в MySQL, используя тот же запрос? - PullRequest
7 голосов
/ 12 марта 2011

Я делаю метод нумерации страниц, что я сделал: Первый запрос подсчитает все результаты, а второй запрос сделает нормальный выбор с помощью LIMIT

Технически, есть ли способ сделать то, что я сделал, но только с одним запросом?

Что у меня сейчас:

SELECT count(*) from table
SELECT * FROM table LIMIT 0,10

Ответы [ 6 ]

12 голосов
/ 27 июня 2013

Никто на самом деле не упоминает об этом, но правильный способ использования техники SQL_CALC_FOUND_ROWS таков:

  1. Выполните ваш запрос: SELECT SQL_CALC_FOUND_ROWS * FROM `table` LIMIT 0, 10
  2. Затем выполните этот запроснепосредственно после этого: SELECT FOUND_ROWS().Результат этого запроса содержит полный счет предыдущего запроса, т. Е. Как если бы вы не использовали предложение LIMIT.Этот второй запрос выполняется быстро, потому что результат уже был кэширован.
3 голосов
/ 12 марта 2011

Хотя я видел некоторые плохие подходы к этому, когда я смотрел на это ранее, было два общепринятых решения:

  1. Выполнение запроса, а затем выполнение того же запроса с count, как вы сделали в своем вопросе.

  2. Запустите ваш запрос, а затем запустите его снова с ключевым словом SQL_CALC_FOUND_ROWS.

например. SELECT SQL_CALC_FOUND_ROWS * FROM table LIMIT 0,10

Этот второй подход заключается в том, как phpMyAdmin это делает.

3 голосов
/ 12 марта 2011

Вы можете сделать это с помощью подзапроса:

select 
    *,
    (select count(*) from mytable) as total
from mytable LIMIT 0,10

Но я не думаю, что это имеет какое-либо преимущество.

edit: Как сказал Илья, общее количество и строки имеют совершенно другое значение, и нет смысла извлекать эти данные из одного и того же запроса. Я буду придерживаться двух запросов. Я просто дал этот ответ, чтобы показать, что это возможно, а не то, что это хорошая идея.

2 голосов
/ 24 июня 2011

SELECT SQL_CALC_FOUND_ROWS ваш запрос здесь Limit ...

Не запуская другие запросы и не разрушая сеанс, затем запустите SELECT FOUND_ROWS ();

И вы получите общее количество строк

2 голосов
/ 12 марта 2011

Вы можете запустить первый запрос, а затем второй запрос, и вы получите как счетчик, так и первые результаты.

Запрос возвращает набор записей. Счетчик определенно не является одной из записей, которые может вернуть запрос «SELECT *», поскольку существует только один счетчик для всего набора результатов.

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

0 голосов
/ 11 июля 2019

Проблема с 2 запросами заключается в согласованности.В промежутке между двумя запросами данные могут быть изменены.Если ваша логика зависит от того, что подсчитано, должно быть возвращено, тогда ваш единственный подход - использовать SQL_CALC_FOUND_ROWS.

Начиная с Mysql 8.0.17 SQL_CALC_FOUND_ROWS и FOUND_ROWS () будут устаревшими.Я не знаю согласованного решения после удаления этой функции.

...