2012-06-01 4 views
6

На данный момент я бег два MySQL запросов, чтобы справиться с моей пагинацией ...Эффективного использования пагинации и MySQL запросы

Query 1 выбирает все строки из таблицы, так что я знаю, сколько страниц мне нужно перечислить.

Query 2 выбирает строки для текущей страницы (например, строки от 0 до 19 (LIMIT 0, 19) для стр. 1, строки 20-39 для второй страницы и т. Д. И т. Д.).

Это кажется пустой тратой двух повторяющихся запросов, с той лишь разницей, что это часть LIMIT.

Что было бы лучшим способом сделать это?

Должен ли я использовать PHP для фильтрации результатов после запуска одного запроса?

Редактировать: Должен ли я запускать один запрос и использовать что-то вроде array_slice() только для списка строк, которые я хочу?

+0

вы ищете что-то вроде этого: http://stackoverflow.com/questions/802373/how-to-count-and-limit-record -in-a-single-query-in-mysql –

+0

Интересно, ответы в этой статье предлагают использовать два запроса, а не предполагаемые «взломать» ... Hmmm ... –

+0

Не используете ли вы count() на q1? Зачем? – Teson

ответ

3

Самый лучший способ - использовать 2 запроса MYSQL для разбивки на страницы (как вы уже используете), чтобы избежать большей головной боли, вы должны упростить запрос, используемый для определения общего количества строк, выбрав только один столбец (скажем, первичный ключ), этого достаточно. SELECT * FROM sampletable WHERE condition1>1 AND condition2>2 для постраничного такого запроса вы можете использовать эти два запроса SELECT * FROM sampletable WHERE condition1>1 AND condition2>2 LIMIT 0,20 SELECT id FROM sampletable WHERE condition1>1 AND condition2>2

+0

Это то, что говорит OP. Ему не нужна головная боль, чтобы уволить 2 вопроса.Он хочет, чтобы суммарный счетчик строк и ограниченный результат в одном запросе. См. Мое решение. –

0

Использование FOUND_ROWS()

оператор SELECT и может включать в себя положение LIMIT, чтобы ограничить количество строк, сервер возвращает клиенту. В некоторых случаях желательно знать, сколько строк оператор должен был бы вернуть без LIMIT, но без повторного запуска оператора. Для получения этого количества строк, включите опцию SQL_CALC_FOUND_ROWS в ЗЕЬЕСТЕ, а затем вызвать FOUND_ROWS() после:

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name 
    -> WHERE id > 100 LIMIT 10; 
mysql> SELECT FOUND_ROWS(); 

Второй ВЫБОР возвращает число, указывающее, сколько строк первого SELECT, вернулся бы, если бы было написано без предложения LIMIT.

Обратите внимание, что это накладывает дополнительную нагрузку на базу данных, поскольку оно должно каждый раз определять размер полного набора результатов. Используйте SQL_CALC_FOUND_ROWS только тогда, когда вам это нужно.

+1

found_rows() - ужасная идея, особенно потому, что SQL_CALC_FOUND_ROWS будет извлекать все строки, даже если вам нужны только первые 20 строк. Таким образом, в основном вы выбираете x количество записей, пока вам действительно нужны 20 или около того записей. если x в миллионах, и ваш запрос имеет много объединений, вы будете долго ждать своего пользователя! –

Смежные вопросы