arlamar
12.04.2013 - 20:58
Всем привет.
В общем, есть задача сделать страницу с подгрузкой категорий по мере прокрутки страницы.
Всё грузится и отображается, не раз такое делал, но тут рандом... т.е. сделать:
ORDER BY RAND() LIMIT 56, 28 нельзя, т.к. будут дубли.
Как лучше реализовать такое?
arlamar
13.04.2013 - 13:16
up
inpost
13.04.2013 - 13:22
1. Псевдо-рандом, генерируй случайный порядок и уже его подключай. Можно 1 раз в 10-15 минут генерировать около 10-15 вариантов за счёт смещения записей и их уже выводи. Псевдо-рандом можно хранить где угодно.
2. грубый способ - добавляй WHERE `id` NOT IN (тут перечисляй уже выведенные ID).
Второй способ ещё терпим, когда не очень много записей.
_____________
Обучаю веб-программированию качественно и не дорого:
http://school-php.comФрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
arlamar
13.04.2013 - 15:14
1. Не совсем понял про псевдо рандом. Это сделать всю выборку и сохранить массив данных?
2. Мне тоже первым делом пришло это в голову. Категорий будет максимум 500, я думаю.
По проекту задумка такая, что при обновлении страницы всё рандомилось. Т.е. хранить по долго псевдо рандом не вариант.
Получается что мне нужно сгенерировать последовательность когда пользователь открыл страницу. Сохранить её куда-то и потом при скролле страницы подгружать из массива по offset.
Но тут встаёт вопрос где хранить массив, т.к. каждого пользователя свой рандом.
Да и вообще, что всё такие лучше. Запрос на выборку 500-1000 записей и хранение(допустим Redis) или NOT IN (тут 500-1000 id) ?
sergeiss
13.04.2013 - 21:15
Цитата (arlamar @ 13.04.2013 - 15:14) |
Но тут встаёт вопрос где хранить массив, т.к. каждого пользователя свой рандом. |
Храни в сессии. Только лучше, наверное, не всю выборку, а только набор айдишников. Если пользователь перестал выбирать данные и просто вышел из браузера, то данные сессии сами "умрут" и будут почищены на сервере.
Причем, хранить лучше, мне кажется, только тот набор айдишников, который уже был выбран данным юзером. Тогда, когда надо еще данные добавить, делаешь очередную выборку и тут добавляешь NOT IN (....).
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
inpost
13.04.2013 - 21:18
1. Не обязательно. Не вижу смысле показывать ВСЕ данные, обычно 1-2, максимум 3 подгрузки делают.
В любой случае, я не думаю, что использовать рандом будет удобно людям.
_____________
Обучаю веб-программированию качественно и не дорого:
http://school-php.comФрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
arlamar
13.04.2013 - 23:07
Цитата |
1. Не обязательно. Не вижу смысле показывать ВСЕ данные, обычно 1-2, максимум 3 подгрузки делают. В любой случае, я не думаю, что использовать рандом будет удобно людям. |
Заказчик хочет, так что придётся делать

Цитата |
Храни в сессии. Только лучше, наверное, не всю выборку, а только набор айдишников. Если пользователь перестал выбирать данные и просто вышел из браузера, то данные сессии сами "умрут" и будут почищены на сервере.
Причем, хранить лучше, мне кажется, только тот набор айдишников, который уже был выбран данным юзером. Тогда, когда надо еще данные добавить, делаешь очередную выборку и тут добавляешь NOT IN (....). |
Да, наверное так и сделаю.
inpost, sergeiss, спасибо за советы.
inpost
13.04.2013 - 23:21
RAND + NOT IN... это безумная нагрузка, учесть, что не рекомендуется в целом пользоваться rand.
_____________
Обучаю веб-программированию качественно и не дорого:
http://school-php.comФрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
sergeiss
14.04.2013 - 01:06
Цитата (inpost @ 13.04.2013 - 23:21) |
RAND + NOT IN... это безумная нагрузка |
Да пусть человек поэкспериментирует

Тебе жалко, что ли? Если у него данных немного, то всё нормально будет. Если много, то сам увидит, когда тормозить начнет.
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
vagrand
14.04.2013 - 10:56
мне кажется что лучшим варинтом будеет сформировать в сессии массив с диопазонами значений для лимита и при подгрузке просто рандомно выбирать из массива диапазон при этом удаляя его из массива. Таким образом будет обеспечен быстрый рандом без нагрузки на бд и файлы сессий
_____________
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
14.04.2013 - 12:21
Цитата |
мне кажется что лучшим варинтом будеет сформировать в сессии массив с диопазонами значений для лимита и при подгрузке просто рандомно выбирать из массива диапазон при этом удаляя его из массива. Таким образом будет обеспечен быстрый рандом без нагрузки на бд и файлы сессий |
Не совсем понял что именно хранить в сессии. Я проснулся недавно, ещё плохо соображаю

Выбираем все категории, загоняем в переменную сессии весь массив $_SESSION['categories'] = shuffle($categories), а потом показываем его по частям?
Но в этом случае в сессии будет лежать ~150Кб данных...
vagrand
14.04.2013 - 21:25
я не знаю как вам обяснить свою мысль более доступно. У запроса есть ператор лимит, прри помощи которого и осуществляется разбиение на страницы, он принимает два параметра, смещение в выборке и количество строк, которое нужно отобрать. Моя идея состоит в том что бы определить общее количество категорий и построить на основании этого количества и количества категорий на странице массив пар значений для лимита, можно даже не пар а только смещений. Затем при каждом аяксовом запросе вы будите рандомно выбирать смещение из этогомассива и вставлять его в лимит, а что бы не было повторени вы можете после выборки значения из массива удалять. Надеюсь так достаточно подробно
_____________
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
15.04.2013 - 01:13
Мужики, а DISTINCT?
vagrand
15.04.2013 - 23:38
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, фрагменты.
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.