У меня возникают проблемы с моим запросом на выбор 100 случайных строк из базы данных с 50 тыс. Строк.
Сначала я использовал только функцию RAND (), но это стало слишком медленным.
Теперь я использую этот запрос:
$query = mysql_query("SELECT t1.* FROM users AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM users WHERE picture != '' && age <= 50 && age >= 18 && username != '')) AS id) AS t2 WHERE picture != '' && age <= 50 && age >= 18 && username != '' && t1.id >= t2.id LIMIT 100"); while($q = mysql_fetch_assoc($query)) { echo $q['id'].'<br>'; }
Но иногда это дает кучу пустых строк.
Может ли кто-нибудь сказать мне, что происходит не так?
Благодаря!
UPDATE Я тоже пытаюсь выполнить этот запрос, но это дает мне ошибку.
$query = mysql_query("SELECT id FLOOR(1 + RAND() * x.m_id) 'rand_ind' FROM users (SELECT MAX(t.id) - 1 'm_id' FROM users t) x WHERE picture != '' && age <= 50 && age >= 18 && username != '' ORDER BY rand_ind LIMIT 100");
mysql_fetch_assoc (): предоставленный аргумент не является допустимым ресурсом результата MySQL
Рандомизируйте заказ с помощью RAND (), а затем просто выберите предел 0,100
order by rand() limit 0,100
Самый быстрый способ сделать это в mysql
Вы можете прочитать это для альтернатив http://jan.kneschke.de/projects/mysql/order-by-rand/. Существуют некоторые ограничения для того, чтобы сделать это способами, предложенными в этой статье, хотя
Если ваш идентификатор в таблице последователен, почему бы просто не генерировать случайные числа x между 0 и «max_rows».
Затем сделайте что-нибудь вроде
'SELECT ... FROM .... WHERE
id in (' . implode(',', $randomNumbers) . ')';
Он вернет строки сгенерированными идентификаторами.
Вы можете использовать:
SELECT ... FROM ... LIMIT $rand,100
Где $rand
– случайное сгенерированное число (0-50k) с кодовой стороны