Forum Webscript.Ru
Общие => Базы данных => Тема начата: 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
-
У тебя ID идут все "по-порядку" или данные удаляются и могут быть пропуски?
-
данные удаляются и могут быть пропуски
-
Можно пронумеровать результаты в соответствии с условиями:
set @count=0;
select @count:=@count+1 as count, id from table where fileld = \'что-то\' order by ... [limit ...];
Можно развить, но смысл ясен... :)
-
Wyclef, да пронумеровать то можно, только ему ведь тогда все равно все данные надо будет вытаскивать. Т.к. запись с id=2856 может быть и 5й и 20й и 2000й ..
-
IMHO, можно чем-то вроде этого (страницы нумеруются с нуля)
select floor(count(id)/2) from $table where id<$id
-
Другой вариант:
Можно задействовать специальную индексную таблицу и периодически сливать туда расчитанные данные и т.д. На основе нее сгенерить страницы и редиректить куда надо.
-
Вот такая идея возникла.
При выводе обычно происходит сортировка по какому-то полю:
SELECT * FROM tab ORDER BY id DESC
(это например)
Тогда запросом
SELECT COUNT(*) FROM tab WHERE id > $id
мы узнаем сколько записей находится перед записью с указанным $id.
Зная это количество можно определить страницу.
Идея ясна ?
-
Макс:
WHERE id > $id
Так записи наверно не по id планируется выводить, а по каким-то другим параметрам, определяющим положение этого id в выборке...
-
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 такой же как и у текущей записи, но стоят они выше в таблице
-
При чем тут выше или нет, id - это, как я понимаю идентификатор записи, в первом запросе он нужен, чтобы определить значение sort_field.
а во втором:
select count(*) from tab where (sort_field >= $sort_field) AND id != $id
ладно, получили число записей у которых sort_field такой же или больше чем у записи c нашим id.
условно count(*)+1 - нужная запись... ну и?
-
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 записей с одинаковыми датами твой запрос всегда будет указывать что текущая запись среди них находится на последнем месте, что не является правдой
ну и?
что "ну и ?" ? Не знаешь как определить страницу ?
-
Очередной раз, Макс, пасиба.
Вроде алгоритм верный.
-
Макс
какой-то 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!!! :)
З.Ы. эхх... хоть бы раз кто спасибо сказал :)))
-
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 записи из данного множества
-
Wyclef
кстати а зачем в SELECT count(*) ...
ты написал ORDER BY ...
Подумай, ты ведь считаешь КОЛИЧЕСТВО записей и пофиг как ты будешь сортровать, количество от сортировки не зависит :)
Возьмси свою полку с книгами, посчитай их, потом поставь в алфавитном порядке и снова посчитай. Количество книг изменилось ? :)
-
Согласен ;)
Вобщем принцип ясен.