$offset_result = mysql_query( " SELECT FLOOR(RAND() * COUNT(*)) AS `offset` FROM `table` WHERE table.done=0 ");
$offset_row = mysql_fetch_object( $offset_result );
$offset = $offset_row->offset;
$result = mysql_query( " SELECT * FROM `table` LIMIT $offset, 1 " );
Вот рабочий запрос, но он почему-то игнорирует запись "WHERE table.done=0". Подскажите, пожалуйста, в чем тут проблема.
Спустя 14 минут, 23 секунды (14.05.2012 - 15:00) Renden написал(а):
Archil
WHERE table.done IS NULL
Спустя 11 минут, 16 секунд (14.05.2012 - 15:12) Archil написал(а):
Не помогает, все-равно он берет все записи.
Спустя 11 минут, 9 секунд (14.05.2012 - 15:23) Renden написал(а):
Archil
Согласно твоему обьяснению:
Согласно твоему обьяснению:
Цитата |
Его суть выбрать случайное значение из таблицы "table", при этом значение поле "done" должно равняться нулю. |
запрос у тя вообще должен быть такой:
SELECT * FROM `table` WHERE `done` IS NULL ORDER BY RAND() LIMIT 1;
Спустя 2 минуты, 38 секунд (14.05.2012 - 15:26) Archil написал(а):
Да, но эта конструкция очень медленная, а у меня будет мнооого значений в таблице, я решил использовать то что написал в первом сообщении.
Спустя 32 минуты, 4 секунды (14.05.2012 - 15:58) vagrand написал(а):
Выражение
никаким образом не повлияет на количество или порядок отобранных элементов. Правильно будет написать так как вам показал Renden. Естественно что rand() в сортировке это очень долго. Быстрее будет сделать следующим образом:
1. Отдельным запросом определите общее количество записей в таблице;
2. Пишете запрос:
FLOOR(RAND() * COUNT(*))
никаким образом не повлияет на количество или порядок отобранных элементов. Правильно будет написать так как вам показал Renden. Естественно что rand() в сортировке это очень долго. Быстрее будет сделать следующим образом:
1. Отдельным запросом определите общее количество записей в таблице;
2. Пишете запрос:
$randValue = rand(1, $rowsNumber);
'select список_полей
from table
limit ' . ($randValue - 10) . ', ' . $randValue
Спустя 10 минут, 5 секунд (14.05.2012 - 16:08) Renden написал(а):
vagrand
Да но фишка в том что ему нужно условие присобачить WHERE `done` IS NULL, и собственно шанс попасть на ту строку где `done` не является нулем будет очень велик.
Да но фишка в том что ему нужно условие присобачить WHERE `done` IS NULL, и собственно шанс попасть на ту строку где `done` не является нулем будет очень велик.
Спустя 3 минуты, 53 секунды (14.05.2012 - 16:12) Archil написал(а):
Наверно воспользуюсь способом Renden, посмотрю как он будет работать, если ничего не будет зависать - то оставлю его, если нет - то буду дальше рыться.
Спасибо Renden.
Спасибо Renden.