Рандомная фильтрация списка группы пользователей icms2

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО
#1 3 февраля 2015 в 11:48
Возник вопрос такого плана, есть группа пользователей, эту группу нужно вывести в виджете на главной список пользователей, но как то хотелось бы рандомно выводить по обновлению страницы показывать разных людей, а не в первых рядах одних и тех же, у кого нибудь еще есть такая задачка, находили ли методы решения?
#2 4 февраля 2015 в 03:11
system/controllers/users/widgets/list/widget.php
ищем:
  1. $profiles = $model->limit($limit)->getUsers();
и меняем на
  1. $users = $model->getUsers();
  2. $profiles = array();
  3. while (count($profiles) < $limit) {
  4. $profiles[] = $users[rand(0,count($users))];
  5. }
остается убрать повторные выборки и лишний перебор на случай если пользователей меньше лимита.
#3 4 февраля 2015 в 09:00
А чем плох array_rand() или shuffle()?
  1. $users = $model->getUsers();
  2. $profiles = array_rand($users, $limit);
  1. $users = $model->getUsers();
  2. $profiles = shuffle($users);
  3. $profiles = array_splice($profiles, $limit);
#4 4 февраля 2015 в 10:01
system/controllers/users/widgets/list/widget.php

после
  1. $model->filterGroups($groups);
вставить
  1. $model->order_by = "RAND()";
#5 4 февраля 2015 в 11:50
r2, использование
  1. SELECT * FROM table ORDER BY RAND()
приведет к увеличению времени обработки запроса.
Val, очень даже хорош
#6 4 февраля 2015 в 11:56
PIN, то есть рандомное извлечение из массива со всеми строками быстрее, по-вашему?
#7 4 февраля 2015 в 12:05

то есть рандомное извлечение из массива со всеми строками быстрее, по-вашему?

r2
тоже хотел высказаться, но не успел. Читал на mysql.ru что да, лучше сперва извлечь все строки (1000 ограничение в 2ке по умолчанию), а потом из них рандомить. Пруф не дам. Просто был удивлен, когда это прочитал. И в памяти отложилось.
#8 4 февраля 2015 в 12:12
Zau4man, вполне может быть, конечно. Но посмотреть на какой-нибудь бенчмарк все равно хотелось бы, если его кто-то сделает
#9 4 февраля 2015 в 12:31
r2, рандом в ордере вытягивает всю таблицу и трудится со всеми записями, что не хорошо.
#10 4 февраля 2015 в 12:36
PIN, я знаю как работает рандом в mysql) вопрос в другом, есть ли существенная разница (и если есть, то насколько) между тем кто именно выбирает случайные строки — mysql или php? ведь суть операции одинаковая в обоих случаях
вы то делайте как вам больше нравится, мне просто интересно стало
#11 4 февраля 2015 в 12:48
Когда-то давно я тоже интересовался этим вопросом, наткнулся на статью, почитал (особенно комменты)… и остановился на ORDER BY RAND()
p.s. Если конечно без этого ну никак
#12 4 февраля 2015 в 12:50
  1. SELECT id FROM table (WHERE)*? ORDER BY RAND()
при условии что есть ID и он PRIMARY
/*/ where, просто обозначил что он там может быть /*/
— будет быстрее чем
  1. SELECT * FROM table ORDER BY RAND()
далее массив id можно сохранить закешировать, порезать кусками и формировать запрос напрмер с IN() вместо лимита, тогда повторений точно не будет )

Думаю нет смысла обсуждать это совсем абстрактно

есть ли существенная разница (и если есть, то насколько) между тем кто именно выбирает случайные строки — mysql или php?

r2

Многое будет зависеть от данных, количества записей, установки MySql и ТД…
#13 4 февраля 2015 в 16:35

количества записей,

• Mike •
предполагаю до 1000 строк напряжения не будет.
Но для наглядности конечно надо цифры.
r2, нет сомнений
#14 5 февраля 2015 в 08:53
Спасибо всем друзья, почитал, узнал много для себя нового, вопрос с виджетом решен.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.