[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: ORDER BY RAND() и пейджер
arlamar
Всем привет.

В общем, есть задача сделать страницу с подгрузкой категорий по мере прокрутки страницы.
Всё грузится и отображается, не раз такое делал, но тут рандом... т.е. сделать:
ORDER BY RAND() LIMIT 56, 28 нельзя, т.к. будут дубли.
Как лучше реализовать такое?
arlamar
up
inpost
1. Псевдо-рандом, генерируй случайный порядок и уже его подключай. Можно 1 раз в 10-15 минут генерировать около 10-15 вариантов за счёт смещения записей и их уже выводи. Псевдо-рандом можно хранить где угодно.
2. грубый способ - добавляй WHERE `id` NOT IN (тут перечисляй уже выведенные ID).
Второй способ ещё терпим, когда не очень много записей.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
arlamar
1. Не совсем понял про псевдо рандом. Это сделать всю выборку и сохранить массив данных?
2. Мне тоже первым делом пришло это в голову. Категорий будет максимум 500, я думаю.

По проекту задумка такая, что при обновлении страницы всё рандомилось. Т.е. хранить по долго псевдо рандом не вариант.

Получается что мне нужно сгенерировать последовательность когда пользователь открыл страницу. Сохранить её куда-то и потом при скролле страницы подгружать из массива по offset.
Но тут встаёт вопрос где хранить массив, т.к. каждого пользователя свой рандом.

Да и вообще, что всё такие лучше. Запрос на выборку 500-1000 записей и хранение(допустим Redis) или NOT IN (тут 500-1000 id) ?
sergeiss
Цитата (arlamar @ 13.04.2013 - 15:14)
Но тут встаёт вопрос где хранить массив, т.к. каждого пользователя свой рандом.

Храни в сессии. Только лучше, наверное, не всю выборку, а только набор айдишников. Если пользователь перестал выбирать данные и просто вышел из браузера, то данные сессии сами "умрут" и будут почищены на сервере.

Причем, хранить лучше, мне кажется, только тот набор айдишников, который уже был выбран данным юзером. Тогда, когда надо еще данные добавить, делаешь очередную выборку и тут добавляешь NOT IN (....).

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
inpost
1. Не обязательно. Не вижу смысле показывать ВСЕ данные, обычно 1-2, максимум 3 подгрузки делают.
В любой случае, я не думаю, что использовать рандом будет удобно людям.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
arlamar
Цитата
1. Не обязательно. Не вижу смысле показывать ВСЕ данные, обычно 1-2, максимум 3 подгрузки делают.
В любой случае, я не думаю, что использовать рандом будет удобно людям.
Заказчик хочет, так что придётся делать smile.gif

Цитата
Храни в сессии. Только лучше, наверное, не всю выборку, а только набор айдишников. Если пользователь перестал выбирать данные и просто вышел из браузера, то данные сессии сами "умрут" и будут почищены на сервере.

Причем, хранить лучше, мне кажется, только тот набор айдишников, который уже был выбран данным юзером. Тогда, когда надо еще данные добавить, делаешь очередную выборку и тут добавляешь NOT IN (....).
Да, наверное так и сделаю.

inpost, sergeiss, спасибо за советы.
inpost
RAND + NOT IN... это безумная нагрузка, учесть, что не рекомендуется в целом пользоваться rand.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
sergeiss
Цитата (inpost @ 13.04.2013 - 23:21)
RAND + NOT IN... это безумная нагрузка

Да пусть человек поэкспериментирует smile.gif Тебе жалко, что ли? Если у него данных немного, то всё нормально будет. Если много, то сам увидит, когда тормозить начнет.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
vagrand
мне кажется что лучшим варинтом будеет сформировать в сессии массив с диопазонами значений для лимита и при подгрузке просто рандомно выбирать из массива диапазон при этом удаляя его из массива. Таким образом будет обеспечен быстрый рандом без нагрузки на бд и файлы сессий

_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
arlamar
Цитата
мне кажется что лучшим варинтом будеет сформировать в сессии массив с диопазонами значений для лимита и при подгрузке просто рандомно выбирать из массива диапазон при этом удаляя его из массива. Таким образом будет обеспечен быстрый рандом без нагрузки на бд и файлы сессий

Не совсем понял что именно хранить в сессии. Я проснулся недавно, ещё плохо соображаю smile.gif
Выбираем все категории, загоняем в переменную сессии весь массив $_SESSION['categories'] = shuffle($categories), а потом показываем его по частям?
Но в этом случае в сессии будет лежать ~150Кб данных...
vagrand
я не знаю как вам обяснить свою мысль более доступно. У запроса есть ператор лимит, прри помощи которого и осуществляется разбиение на страницы, он принимает два параметра, смещение в выборке и количество строк, которое нужно отобрать. Моя идея состоит в том что бы определить общее количество категорий и построить на основании этого количества и количества категорий на странице массив пар значений для лимита, можно даже не пар а только смещений. Затем при каждом аяксовом запросе вы будите рандомно выбирать смещение из этогомассива и вставлять его в лимит, а что бы не было повторени вы можете после выборки значения из массива удалять. Надеюсь так достаточно подробно


_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
Zzepish
Мужики, а DISTINCT?
vagrand
Zzepish
И причем же тут distinct?

_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.