SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 03.10.2008 01:46:18

Student20
Участник
Зарегистрирован: 08.07.2008
Сообщений: 17

Запрос Для Постраничной навигации

Задача в том, чтобы сделать банальную постраничную навигацию, например такого вида  << 3 4 5 6 7 >
Но в таблице могут хранится тысячи записей. Если сделать count(*) из таблицы, наверняка это не самый лучший способ? smile этот запрос ведь будет выполнятся при каждом переходе по страницам.

Я сделал так : выбираю лимитом. знаю с какой записи начинать и сколько выбирать. из этого я могу получить навигацию такого типа : << 3 4 5 . Но дальше я не знаю есть ли записи еще для выборки для 6 страницы. Я могу лимитом выбирать на одну запись больше, тогда я узнаю существует ли следующая 6 страница, а саму лишию запись при выводе на экран откинуть. Тогда получу навигацию такую : << 3 4 5 6 . А как можно узнать есть ли записи дальше еще ? хотя бы еще на одну страницу. Ладно на одну запись больше делать выборку, но на 11 если на страницу выводится по 10 записей, слишком много лишней информации получается...

кроме как count(*) или SQL_CALC_FOUND_ROWS ничего больше не придумывается.

Надеюсь мысль донести получилось) Плиз Хелп smile

Неактивен

 

#2 03.10.2008 02:06:02

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Запрос Для Постраничной навигации

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

Также можете отдельным запросом с LIMIT выбирать тольео id-шники, тогда их можно и на 100 больше, ничего страшного не произойдет. Затем уже SELECT * WHERE ID IN (123,124,125,126,127,128,129,130,131,132)

Неактивен

 

#3 03.10.2008 02:19:50

Student20
Участник
Зарегистрирован: 08.07.2008
Сообщений: 17

Re: Запрос Для Постраничной навигации

Спасибо большое smile мысли в этих направлениях были тоже, но показалось, что это тоже "тяжеловатые" варианты, наверно из-за неопытности и неуверенности.
Попробую подвесить на триггер. в моем случае записи создаются\удаляются не так часто и такой вариант наверно будет получше чем дополнительный подзапрос, который наверно был бы лучше, если бы записи создавались\удалялись постоянно.

А под этими словами :
 

rgbeast написал:

Также можете отдельным запросом с LIMIT выбирать тольео id-шники, тогда их можно и на 100 больше, ничего страшного не произойдет.

Вы имеете ввиду, что нагрузка в данном случае вырастает незначительно ?

Отредактированно Student20 (03.10.2008 02:22:13)

Неактивен

 

#4 03.10.2008 02:32:55

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Запрос Для Постраничной навигации

Скорее всего вырастет незначительно, так как если обход по индексу - то он происходит быстро, а если сортировка, то все равно выполняется сначала сортировка, а потом LIMIT.

Неактивен

 

#5 03.10.2008 14:03:19

Student20
Участник
Зарегистрирован: 08.07.2008
Сообщений: 17

Re: Запрос Для Постраничной навигации

А если не по всей таблице а с условием и LIMIT, то сортировка будет по результату или тоже сначала сортировка по всей таблице, а потом выборка по условию ? smile

P.S. кажется я понял. сначала условие, потом сортировка, потом лимит smile

Отредактированно Student20 (03.10.2008 14:07:55)

Неактивен

 

#6 03.10.2008 14:10:20

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: Запрос Для Постраничной навигации

Сначала WHERE потом сортировка того, что осталось, затем LIMIT
Есть альтернативный вариант - если сортировка по ключу, то обходит по ключу в порядке сортировки проверяет WHERE и так пока не достигнет LIMIT

Неактивен

 

#7 03.10.2008 14:14:33

Student20
Участник
Зарегистрирован: 08.07.2008
Сообщений: 17

Re: Запрос Для Постраничной навигации

Спасибо за помощь ! smile

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson