Автор Тема: Незнаю к чему это больше отнести к PHP или к MySQL. Чудной способ перемешивания...  (Прочитано 3694 раз)

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

Оффлайн nobody

  • вроде как одушевленный
  • Постоялец
  • ***
  • Сообщений: 218
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.n0b0dy.ru
Проблема состоит вот в чем нужно вывести результаты из базы данных и перемешать их, что бы он не шли последовательно как в базе...
Вы скажете чего проще грузи результат в масив и мешай как душе угодно...
Но как всегда есть маленькие но...
Проблема в том что вывод результата должен быть разбит на страници, а если в базе более 10.000 записей пердставляете как все затормазиться?
Алгоритм я примерно представляю, а как осуществить кодом неселен...
Алгоритм такой...
1. Считать из базы все ID
2. Загнать их в масив и пермешать
3. Создать в MySql временную таблицу и загнать перемешанный результат туда
4. Затем построить запрос и вывод результата с использованием временной таблици с ID соответственно разбив на нужное количество записей...

Хотя может это и не лучший вариант :)
.::dO_ob::.

Оффлайн Britva

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1660
  • +0/-0
  • 0
    • Просмотр профиля
    • http://eugeny.com
а почему бы не сделать обычный "select ... order by rand() limit $perpage"
т.е. случайным образом перемешать, и выводить первые $perpage записей из таблицы. зачем нагружать сервер, все равно это будут случайные записи, а смысла в разбитии на страницы я не вижу.
Евгений aka Razor,

Оффлайн nobody

  • вроде как одушевленный
  • Постоялец
  • ***
  • Сообщений: 218
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.n0b0dy.ru
Мне ненежно только несколько случайных.
А насчет нагрузки на сервер - это уже проблема хостера.
.::dO_ob::.

Оффлайн Britva

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1660
  • +0/-0
  • 0
    • Просмотр профиля
    • http://eugeny.com
получается надо сохранять где-то этот массив, потому что при переходе на следующую страницу, массив опять будет случайным образом разбит.
так что где-нибудь в куках/сессиях.
А можно поинтересоваться почему именно так нужно?
Евгений aka Razor,

Оффлайн nobody

  • вроде как одушевленный
  • Постоялец
  • ***
  • Сообщений: 218
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.n0b0dy.ru
Цитировать
А можно поинтересоваться почему именно так нужно?

Просто представь :) сайт знакомств - огромное количество онкет... Соответственно по мере дополнения объявлений старые уходят в бездну и соответственно пользователю будет довольно неинтересно что там за анкеты были добавленны с утра, он посмотрит только первых несколько. А это как известно не будет хорошо, а когда их вывести случайным образом то все будут в равном положении. Я передусматривал сортировку за тикущей день.

А что бы избавиться от того что при переходе на следующию страницу не происходила сортировка, я и предусмотрел временную таблицу, но это уже MySql...Britva
Britva
.::dO_ob::.

Оффлайн Britva

  • Координатор
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1660
  • +0/-0
  • 0
    • Просмотр профиля
    • http://eugeny.com
Временная таблица (temporary table) создается только на время выполнения скрипта, по завершении она удаляется. Так что все равно придется сохранять где-нибудь весь массив. а заниматься созданием бесконечного числа таблиц (не временных) это уже тяжеловато для хостера.

Только я не вижу в этом смысла, смотри, например вывожу я десять анкет, и кнопочка - следующие десять, и все они случайным образом выводятся, к тому же если в районе 10 т. то вероятность совпадения очень мала.
Евгений aka Razor,

Оффлайн nobody

  • вроде как одушевленный
  • Постоялец
  • ***
  • Сообщений: 218
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.n0b0dy.ru
М да получаеться, что надо будет вставлять проверку на срок давности таблици и если она старая то удалять так и хостер не устанет.....
.::dO_ob::.

Оффлайн MHz

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 44
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.jafar.ru
Приветствую.
Зачем опять загонять данные в MySQL. Просто выбирать данные из массива в соотвествии с перемешанным массивом.
То есть на каждую сессию у тебя будет только один массив с ID. Выбираешь 10 ID в соответсвии с текущей позицией в массиве и по ним извлекаешь из бызы анкеты.
Сам массив можно зарегестрировать в сессии, но лучше сделать сортировку псевдослучайной, в качестве опоры взяв какое-то большое число. То есть скрипту передается это большое число и позиция в массиве (страница). Надо посмотреть справочник по математике, там есть эта формула генерации случайного числа, я на память не помню.

Удачи.
Feci, quod potui, faciant meliora potentes

 

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