Постраничный вывод с перемешиванием?

REMO

Guest
Постраничный вывод с перемешиванием?

Есть БД, с рядом товарных позиций.

Необходимо организовать постраничный вывод этой БД. Это просто.
Так же необходимо, чтобы список товаров при выводе перемешивался, причем в рамках всего списка, а не в рамках одной страницы (т.е. одного LIMIT).

Можно конечно сделать столбец с псевдоиндексами, который и перемешивать (каждые минут 10 скажем), а выводить уже на основании него, но это создает другую проблему. Что, если зашедший посетитель просматривает первую страницу, в это время происходит перемешивание и, следовательно, на втрой странице он увидит неправильный результат.

Как быть?
 

Breeze

goshogun
Команда форума
Партнер клуба
ORDER BY RAND() возможно поможет..
 

REMO

Guest
Как же он может помочь? ))

Так чтобы постраничный вывод был корректным.
 

REMO

Guest
Что нафиг нужно? перемешивание? нужно чтобы пользователь видел разнообразие товара, и чтобы разные позиции товара имели равную возможность на покупку.

Да это в принципе не имеет значения.
 

Breeze

goshogun
Команда форума
Партнер клуба
Не знаю..

Самое простое, что в голову приходит:

select id_field from table order by rand();

id_field в массив, а массив в сессию.. а дальше с ней и работаешь..
 

REMO

Guest
нет, с сессией не хотелось бы, т.к. при большой посещаемости это будет геморно, а если еще и много товара, позиций 150-200, то что получится... имхо не очень красивое решение.
 

Breeze

goshogun
Команда форума
Партнер клуба
чем же это будет геморно?


ЗЫ: 150-200 это много?
 

Frenk

Guest
? нужно чтобы пользователь видел разнообразие товара,
Нужно, с вашего позволения, чтобы пользователю было удобно. Мне удобно, когда все по порядку, а не в куче.
Это раз.
и чтобы разные позиции товара имели равную возможность на покупку.
Логичней было бы вести рейтинг. имхо.
 

Breeze

goshogun
Команда форума
Партнер клуба
Автор оригинала: Frenk
Нужно, с вашего позволения, чтобы пользователю было удобно. Мне удобно, когда все по порядку, а не в куче.
Это раз.

Логичней было бы вести рейтинг. имхо.
Золотые слова.. Пользователь в любом случае купит то, что ему надо, а постоянно перемешивая позиции он будет путатся при следующих посещениях в попытке найти то же самое..

Есдинственное, но! Рейтинга не нужно, иначе равноправия у позиций не будет..
 

sergo

Guest
вот такой вариант:
1. добавляем поле hash, например md5 от id
2. генерим случайное значение от 0 до 32
3. используем запрос типа:

select id, SUBSTRING(hash, <сгенеренное случайное число>,1) as ord from tst order by ord;

4. запоминаем случайное число в сессию, для вывода последующих страниц
 

REMO

Guest
Автор оригинала: sergo
вот такой вариант:
1. добавляем поле hash, например md5 от id
2. генерим случайное значение от 0 до 32
3. используем запрос типа:

select id, SUBSTRING(hash, <сгенеренное случайное число>,1) as ord from tst order by ord;

4. запоминаем случайное число в сессию, для вывода последующих страниц
Я что то не догнал идею. Мы выделяем из строки hash один символ. А сортируем по ord это как? Орд же не столбец, это символ. Чего то я не понял до конца (

.....

Насчет того как выводить список товаров. Это вопрос не этой темы поэтому нет смысла его обсуждать. Можно считать, что это исходное ТЗ такое.
 

fixxxer

К.О.
Партнер клуба
$query = "SELECT ... ORDER BY RAND('$sid')"

$sid - любое уникальное для данного посетителя значение, например, ID сессии. Если (почему?) не хочешь использовать сессии - передавай это значение в GET или POST ручками.
 

REMO

Guest
Автор оригинала: fixxxer
$query = "SELECT ... ORDER BY RAND('$sid')"

$sid - любое уникальное для данного посетителя значение, например, ID сессии. Если (почему?) не хочешь использовать сессии - передавай это значение в GET или POST ручками.
Поправьте меня, если я не прав.
ORDER BY RAND('$sid') - дает определенное случайное расположение элементов столбца, которое зависит от $sid. Т.е. проще говоря, в зависимости от того какой $sid ввести, такое случайное распоожение и получишь. Так?

Если так то это и есть решение проблемы.

Я не хотел заморачиваться с сессиями, т.к. не хотел писать туда весь массив id, это решение явно некрасивое. А вот писать в сессию одну строку, даже и писать ничего не надо, просто сид иметь ))
 

fixxxer

К.О.
Партнер клуба
тока я чуток наврал, аргументом RAND() должно быть число.

например crc32($sid)
 

sergo

Guest
Автор оригинала: REMO
Я что то не догнал идею. Мы выделяем из строки hash один символ. А сортируем по ord это как? Орд же не столбец, это символ. Чего то я не понял до конца (

.....

Насчет того как выводить список товаров. Это вопрос не этой темы поэтому нет смысла его обсуждать. Можно считать, что это исходное ТЗ такое.
мы выделяем один символ в псевдо столбец ord, затем сортируем по этому псевдо столбцу
 
Сверху