Одинаковый результат запроса с rand()

WebByte

Проходящий мимо
Одинаковый результат запроса с rand()

MySQL 3.23.54

Запрос
PHP:
SELECT * FROM banner ORDER BY RAND() LIMIT 2
возвращает всегда первые две записи из таблицы.

Число записей в таблице < 10

Почему одинаковые результаты?
 

tony2001

TeaM PHPClub
RAND(N)
В выражениях вида ORDER BY не следует использовать столбец с величинами RAND(), поскольку применение оператора ORDER BY приведет к многократным вычислениям в этом столбце. В версии MySQL 3.23 можно, однако, выполнить следующий оператор: SELECT * FROM table_name ORDER BY RAND(): он полезен для получения случайного экземпляра из множества SELECT * FROM table1,table2 WHERE a=b AND c<d ORDER BY RAND() LIMIT 1000. Следует учитывать, что оператор RAND() в выражении WHERE при выполнении выражения WHERE будет вычисляться каждый раз заново. Оператор RAND() не следует воспринимать как полноценный генератор случайных чисел: это просто быстрый способ динамической генерации случайных чисел, переносимых между платформами для одной и той же версии MySQL.
http://dev.mysql.com/doc/mysql/ru/Mathematical_functions.html
 

WebByte

Проходящий мимо
Тони, спасибо за цитирование мануала. Читаю его, читаю. Но от этого проблема не решается.

Неужели выход один - вытаскивать все записи и использовать уже генератор случайных чисел php?
 

tony2001

TeaM PHPClub
WebByte
делать в 3 шага:
1) посчитать кол-во записей в таблице - N
2) сгенерить два случайных числа от 1 до N
3) вынуть записи запросом c LIMIT N-1,1
 

WebByte

Проходящий мимо
Не совсем понятно куда деть полученные случайные числа применительно к третьему пункту. И почему именно LIMIT N-1, 1. Ведь в таком случае вернется одна запись.

-~{}~ 11.09.04 17:52:

Единственно, что могу предположить - два запроса
SELECT * FROM banner LIMIT N1, 1
SELECT * FROM banner LIMIT N2, 1
где N1, N2 - случайные числа, полученные в пункте 2)
 

fixxxer

К.О.
Партнер клуба
Хм, интересно. На 4.0.20 все нормально...
А если
select RAND() as R, * from banner ORDER BY R LIMIT 2
что в первой колонке получается?
 

WebByte

Проходящий мимо
Про 4-ку я в курсе, но пока не могу сменить версию - это ограничения хостинга..

Такой запрос выдал ошибку.

А запрос
select RAND() as R, banner.* from banner ORDER BY R LIMIT 2
выдает в первом столбце каждый раз разные результаты.. Но от этого ничего не меняется в остальных столбцах
 

WebByte

Проходящий мимо
Цитирую.
Начиная с PHP 4.2.0, больше нет необходимости инициализировать генератор случайных чисел функциями srand() или mt_srand(), поскольку теперь это происходит автоматически.
php 4.3.8
 
Сверху