Как вынуть случайного пользователя или нескольких пользователей? Если бы дело касалось инфоблоков, то там есть $arSort = array("RAND"=>""); и дело сделано. А метод CUser::GetList такое не понимает. Может есть способ? Какой-нибудь, как обычно, недокументированный?
Это не решение. Даже попробовал запустить для спортивного интереса - глупо и не работает. Нельзя писать в фильтр условия сортировки. Они попросту будут пропущены при формировании SQL запроса да и всё.
Ну, буду как-нибудь выкручиваться с этой сортировкой по-другому.
Сейчас на моём сайте 23 тыщи 686 человек... надо выбрать 3 случайных... метод CUser::GetList не имеет возможности сократить кол-во полей в выборке до одного лишь ID.... дальше рассуждения продолжать?
Пойду я читать исходный код - как же рандомом выбирают элементы инфоблоков.
Большущее спасибо Это тоже решение. Правда, у него ограничение - при кол-ве записей больше 100К будет жесткий тормозняк БД. Сам я такое не проверял, но вот при помощи хэлпа по MySQL нашел статью в блоге, где об этом говорится. Там же предлагается иное решение, код которого я привожу ниже.
//Сколько случайных пользователей мы хотим получить?
$randUserCnt = 3;
//Получить общее кол-во пользователей
$totalUserCnt = CUser::GetCount();
//Вычисление фракции
$fraction = ($randUserCnt/$totalUserCnt);
//Искусственное приращение фракции для борьбы с плохим генератором при маленькой выборке.
$fractionInc = $fraction*1.8;
if ( $fractionInc < 1)
{
$fraction = $fractionInc;
}
//Формирование запроса
$myUserRandQuery = 'SELECT ID FROM b_user WHERE RAND() <= '.$fraction.' LIMIT '.$randUserCnt;
echo $myUserRandQuery."<br>";
//Делаем хитрый запрос к БД при помощи готового экземпляра класса CDataBase : $DB
$result = $DB->Query($myUserRandQuery, true);
while ($arRandUser = $result->Fetch())
{//Печать случайных ID пользователей
echo $arRandUser["ID"]."<br>";
}
Преимущества решения: + есть легкое средство борьбы с плохим генератором чисел. Он на любой ЭВМ имеет линейное распределение только при N > 100, т.к. реализовано на ПСЕВДОслучайном алгоритме. + способ не грузит БД, т.к. не заставляет её сортировать ничего и подходит для больших объемов данных - более 100 тыс пользователей
Недостатки метода: - иногда возвращается меньше пользователей, чем было запрошено. Причина - плохой генератор рандома. С этим легко бороться, если делать повтор и "добирать" нехватающих пользователей.
Решение опробовано для случая, когда кол-во пользователей N = 5 и N = ~30K Результат: пятерка с минусом.