[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Неправильная выборка из таблицы
Archil
Есть запрос. Его суть выбрать случайное значение из таблицы "table", при этом значение поле "done" должно равняться нулю.

$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 написал(а):
Выражение

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` не является нулем будет очень велик.

Спустя 3 минуты, 53 секунды (14.05.2012 - 16:12) Archil написал(а):
Наверно воспользуюсь способом Renden, посмотрю как он будет работать, если ничего не будет зависать - то оставлю его, если нет - то буду дальше рыться.
Спасибо Renden.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.