Автор Тема: MySQL + постраничный вывод + локэйт  (Прочитано 7479 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Alexandr

  • Фанат форума
  • Ветеран
  • *****
  • Сообщений: 865
  • +0/-0
  • 0
    • Просмотр профиля
    • http://gtp.hobi.ru
Есть данные, выводятся постранично.
Как найти нужную страницу на которой находится искомая запись, зная ИД\'шник записи?

Вот пример:
http://top.mail.ru/jump?from=50364
Получаем:
http://top.mail.ru/Rating/Computers-Programming/Today/Hosts/1.html#25
Kiss my CSS
Pусские gtp gp3 ( midi + tab ) -   - Все для Авто.

Оффлайн fidget

  • Непоседа
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 607
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
MySQL + постраничный вывод + локэйт
« Ответ #1 : 05 Июня 2003, 15:51:24 »
У тебя ID идут все "по-порядку" или данные удаляются и могут быть пропуски?
На Машине Тьюринга далеко не уедешь.

Оффлайн Alexandr

  • Фанат форума
  • Ветеран
  • *****
  • Сообщений: 865
  • +0/-0
  • 0
    • Просмотр профиля
    • http://gtp.hobi.ru
MySQL + постраничный вывод + локэйт
« Ответ #2 : 05 Июня 2003, 15:57:01 »
данные удаляются и могут быть пропуски
Kiss my CSS
Pусские gtp gp3 ( midi + tab ) -   - Все для Авто.

Оффлайн Wyclef

  • hello_worlder
  • Старожил
  • ****
  • Сообщений: 307
  • +0/-0
  • 2
    • Просмотр профиля
    • http://thug.narod.ru
MySQL + постраничный вывод + локэйт
« Ответ #3 : 06 Июня 2003, 10:45:48 »
Можно пронумеровать результаты в соответствии с условиями:

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


Можно развить, но смысл ясен... :)
It\'s nice to be important, but it\'s more important to be nice!

Оффлайн fidget

  • Непоседа
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 607
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
MySQL + постраничный вывод + локэйт
« Ответ #4 : 06 Июня 2003, 11:37:23 »
Wyclef, да пронумеровать то можно, только ему ведь тогда все равно все данные надо будет вытаскивать. Т.к. запись с id=2856 может быть и 5й и 20й и 2000й ..
На Машине Тьюринга далеко не уедешь.

Оффлайн Maniac

  • Ума нет - считай коллега
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 844
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
MySQL + постраничный вывод + локэйт
« Ответ #5 : 06 Июня 2003, 12:01:25 »
IMHO, можно чем-то вроде этого (страницы нумеруются с нуля)

select floor(count(id)/2) from $table where id<$id
TANSTAAFL

Оффлайн Wyclef

  • hello_worlder
  • Старожил
  • ****
  • Сообщений: 307
  • +0/-0
  • 2
    • Просмотр профиля
    • http://thug.narod.ru
MySQL + постраничный вывод + локэйт
« Ответ #6 : 06 Июня 2003, 12:01:58 »
Другой вариант:

Можно задействовать специальную индексную таблицу и периодически сливать туда расчитанные данные и т.д. На основе нее сгенерить страницы и редиректить куда надо.
It\'s nice to be important, but it\'s more important to be nice!

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
MySQL + постраничный вывод + локэйт
« Ответ #7 : 06 Июня 2003, 12:43:33 »
Вот такая идея возникла.
При выводе обычно происходит сортировка по какому-то полю:
SELECT * FROM tab ORDER BY id DESC
(это например)

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

Идея ясна ?
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Wyclef

  • hello_worlder
  • Старожил
  • ****
  • Сообщений: 307
  • +0/-0
  • 2
    • Просмотр профиля
    • http://thug.narod.ru
MySQL + постраничный вывод + локэйт
« Ответ #8 : 06 Июня 2003, 12:48:35 »
Цитировать
Макс:
WHERE id > $id


Так записи наверно не по id планируется выводить, а по каким-то другим параметрам, определяющим положение этого id  в выборке...
It\'s nice to be important, but it\'s more important to be nice!

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
MySQL + постраничный вывод + локэйт
« Ответ #9 : 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 такой же как и у текущей записи, но стоят они выше в таблице
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Wyclef

  • hello_worlder
  • Старожил
  • ****
  • Сообщений: 307
  • +0/-0
  • 2
    • Просмотр профиля
    • http://thug.narod.ru
MySQL + постраничный вывод + локэйт
« Ответ #10 : 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 - нужная запись... ну и?
It\'s nice to be important, but it\'s more important to be nice!

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
MySQL + постраничный вывод + локэйт
« Ответ #11 : 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 записей с одинаковыми датами твой запрос всегда будет указывать что текущая запись среди них находится на последнем месте, что не является правдой

Цитировать
ну и?
что "ну и ?" ? Не знаешь как определить страницу ?
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Alexandr

  • Фанат форума
  • Ветеран
  • *****
  • Сообщений: 865
  • +0/-0
  • 0
    • Просмотр профиля
    • http://gtp.hobi.ru
MySQL + постраничный вывод + локэйт
« Ответ #12 : 06 Июня 2003, 15:31:02 »
Очередной раз, Макс, пасиба.
Вроде алгоритм верный.
Kiss my CSS
Pусские gtp gp3 ( midi + tab ) -   - Все для Авто.

Оффлайн Wyclef

  • hello_worlder
  • Старожил
  • ****
  • Сообщений: 307
  • +0/-0
  • 2
    • Просмотр профиля
    • http://thug.narod.ru
MySQL + постраничный вывод + локэйт
« Ответ #13 : 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!!! :)

З.Ы. эхх... хоть бы раз кто спасибо сказал :)))
It\'s nice to be important, but it\'s more important to be nice!

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
MySQL + постраничный вывод + локэйт
« Ответ #14 : 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 записи из данного множества
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28