Forum Webscript.Ru

Общие => Базы данных => Тема начата: Alexandr от 05 Июня 2003, 15:47:18

Название: MySQL + постраничный вывод + локэйт
Отправлено: Alexandr от 05 Июня 2003, 15:47:18
Есть данные, выводятся постранично.
Как найти нужную страницу на которой находится искомая запись, зная ИД\'шник записи?

Вот пример:
http://top.mail.ru/jump?from=50364
Получаем:
http://top.mail.ru/Rating/Computers-Programming/Today/Hosts/1.html#25
Название: MySQL + постраничный вывод + локэйт
Отправлено: fidget от 05 Июня 2003, 15:51:24
У тебя ID идут все "по-порядку" или данные удаляются и могут быть пропуски?
Название: MySQL + постраничный вывод + локэйт
Отправлено: Alexandr от 05 Июня 2003, 15:57:01
данные удаляются и могут быть пропуски
Название: MySQL + постраничный вывод + локэйт
Отправлено: Wyclef от 06 Июня 2003, 10:45:48
Можно пронумеровать результаты в соответствии с условиями:

set @count=0;
select @count:=@count+1 as count, id from table where fileld = \'что-то\' order by ... [limit ...];


Можно развить, но смысл ясен... :)
Название: MySQL + постраничный вывод + локэйт
Отправлено: fidget от 06 Июня 2003, 11:37:23
Wyclef, да пронумеровать то можно, только ему ведь тогда все равно все данные надо будет вытаскивать. Т.к. запись с id=2856 может быть и 5й и 20й и 2000й ..
Название: MySQL + постраничный вывод + локэйт
Отправлено: Maniac от 06 Июня 2003, 12:01:25
IMHO, можно чем-то вроде этого (страницы нумеруются с нуля)

select floor(count(id)/2) from $table where id<$id
Название: MySQL + постраничный вывод + локэйт
Отправлено: Wyclef от 06 Июня 2003, 12:01:58
Другой вариант:

Можно задействовать специальную индексную таблицу и периодически сливать туда расчитанные данные и т.д. На основе нее сгенерить страницы и редиректить куда надо.
Название: MySQL + постраничный вывод + локэйт
Отправлено: Макс от 06 Июня 2003, 12:43:33
Вот такая идея возникла.
При выводе обычно происходит сортировка по какому-то полю:
SELECT * FROM tab ORDER BY id DESC
(это например)

Тогда запросом
SELECT COUNT(*) FROM tab WHERE id > $id
мы узнаем сколько записей находится перед записью с указанным $id.
Зная это количество можно определить страницу.

Идея ясна ?
Название: MySQL + постраничный вывод + локэйт
Отправлено: Wyclef от 06 Июня 2003, 12:48:35
Цитировать
Макс:
WHERE id > $id


Так записи наверно не по id планируется выводить, а по каким-то другим параметрам, определяющим положение этого id  в выборке...
Название: MySQL + постраничный вывод + локэйт
Отправлено: Макс от 06 Июня 2003, 12:59:39
Wyclef
определяем значение поля по которому сортируем у текущей записи
select sort_field from tab where id = $id

затем считаем сколько перед ней записей
select count(*) from tab where (sort_field > $sort_field) OR (sort_field = $sort_field AND id > $id)

второе условие в запросе для того чтобы посчитать записи у которых sort_field такой же как и у текущей записи, но стоят они выше в таблице
Название: MySQL + постраничный вывод + локэйт
Отправлено: Wyclef от 06 Июня 2003, 13:38:37
При чем тут выше или нет, id - это, как я понимаю идентификатор записи, в первом запросе он нужен, чтобы определить значение sort_field.

а во втором:
select count(*) from tab where (sort_field >= $sort_field) AND id != $id

ладно, получили число записей у которых sort_field такой же или больше чем у записи c нашим id.

условно count(*)+1 - нужная запись... ну и?
Название: MySQL + постраничный вывод + локэйт
Отправлено: Макс от 06 Июня 2003, 15:08:57
Wyclef
если ты делаешь сортировку например по дате (ORDER BY date DESC)
мускуль выводит сначало новые записи потом старые.
Если у нескольких записей дата одинакова, то они выводятся в порядке добавления в таблицу (которые раньше были добавлены будут выведены выше).
Если id - auto_increment сделать, то у записей с одинаковыми датами запись которая будет выше  будет иметь ID меньше (потому как она раньше была добавлена в таблицу). У меня кстати ошибка в предыдущем посте, нужно
 (sort_field = $sort_field AND id < $id)

Почему твой запрос может ошибку выдавать?
Цитировать
select count(*) from tab where (sort_field >= $sort_field) AND id != $id

потому что если есть 100 записей с одинаковыми датами твой запрос всегда будет указывать что текущая запись среди них находится на последнем месте, что не является правдой

Цитировать
ну и?
что "ну и ?" ? Не знаешь как определить страницу ?
Название: MySQL + постраничный вывод + локэйт
Отправлено: Alexandr от 06 Июня 2003, 15:31:02
Очередной раз, Макс, пасиба.
Вроде алгоритм верный.
Название: MySQL + постраничный вывод + локэйт
Отправлено: Wyclef от 06 Июня 2003, 15:49:33
Макс
какой-то ORDER изначально подразумевался вообще-то... я не счел нужным его упоминать.

Цитировать
потому что если есть 100 записей с одинаковыми датами



DATE -> timestamp (какова вероятность сделать его одинаковым? :))

Цитировать
Почему твой запрос может ошибку выдавать?


id - лично у меня он всегда auto_icrement

А если так:
select count(*) from tab where (sort_field >= $sort_field) AND id != $id order by sort_field desc, id desc

Цитировать
Не знаешь как определить страницу?

сорри забыл "ну и?" удалить :)

Alexandr
Одна голова хорошо, а webscript - rulez!!! :)

З.Ы. эхх... хоть бы раз кто спасибо сказал :)))
Название: MySQL + постраничный вывод + локэйт
Отправлено: Макс от 06 Июня 2003, 17:08:05
Wyclef
Цитировать
select count(*) from tab where (sort_field >= $sort_field) AND id != $id order by sort_field desc, id desc

Пример.
есть таблица:
ID | date
1  | 15.03.2001
2  | 14.03.2001
3  | 14.03.2001
4  | 14.03.2001

Сортировка по date. Текущая запись ID = 2. Перед ней одна запись
А если твой запрос сделать, он выдаст что перед ней 3 записи.
Почему ? Потому что условию
(date >= \'14.03.2001\') AND id != 2
соответствуют 3 записи из данного множества
Название: MySQL + постраничный вывод + локэйт
Отправлено: Макс от 06 Июня 2003, 17:16:00
Wyclef
кстати а зачем в SELECT count(*) ...
ты написал ORDER BY ...

Подумай, ты ведь считаешь КОЛИЧЕСТВО записей и пофиг как ты будешь сортровать, количество от сортировки не зависит :)

Возьмси свою полку с книгами, посчитай их, потом поставь в алфавитном порядке и снова посчитай. Количество книг изменилось ? :)
Название: MySQL + постраничный вывод + локэйт
Отправлено: Wyclef от 07 Июня 2003, 11:44:38
Согласен ;)
Вобщем принцип ясен.