Всем ку Нужно выбрать случайную строку из таблицы. Структура такова: 3 поля (id, source, num). id идет без дырок подряд. Пробовал вот такую здоровенную конструкцию: Код (Text): SELECT * FROM `stories` WHERE `source`='sram' AND `num`=((SELECT MIN(id) FROM `stories` WHERE `source`='sram') + ((SELECT COUNT(*) FROM `stories` WHERE `source`='sram') * RAND())); т.е. берем минимальный id для этого source + число элементов с этим source * RAND(). А он мне эррор. Подскажите, правильно ли я вообще копаю и как реализуется выбор случайной строки из базы.
Хорошая ссылка. Хочется добавить, что в реале скорее выборка может понадобиться не совсем случайная. Т.е. для посетителя она будет выглядеть случайной, но мы то лучше знаем что стОит показывать Например есть галерея с миллионами фотографий, но в ротации "случайных" кадров интереснее видеть те, что опубликованы или комментировались не более недели назад. Или имеют хороший рейтинг. Т.о. мы сокращаем область определения до разумных величин, которые реально засунуть в кеш. Кеш обновлять, скажем, раз в сутки, а частые выборки будут происходить из кеша мгновенно.
За линк и комменты спасибо. Только непонятно, почему мой варик не хочет работать. Разве такие запросы строить нельзя?
С предыдущим ладно, сделал немного по-другому. Есть таблица sram, устройство такое (поля id, num - оба выставил bigint). id идут непрерывно от 1 до много. Пытаюсь выбирать случайное значение num так: Код (Text): SELECT * FROM `sram` WHERE `id` = 1 + FLOOR((SELECT COUNT(*) FROM `sram`) * RAND()) Причем выбирается то две строки, то вообще ни одной. Как так получается? Ведь id в WHERE выбирается единственным образом. Отдельно пробовал исполнять Код (Text): SELECT 1 + FLOOR((SELECT COUNT(*) FROM `sram`) * RAND()) Всегда по одному значению, а когда полный запрос - ерунда какая-то. Где я провафлил, подскажите, пожалуйста, умные головы P.S. Вывод проверял таким кодом: Код (PHP): <?php $m = new mysqli('localhost', 'root', '1234', 'sram'); for($i = 1; $i <= 100; $i++) { $result = $m->query("SELECT * FROM `sram` WHERE `id` = 1 + FLOOR((SELECT COUNT(*) FROM `sram`) * RAND())"); $row = $result->fetch_all(); print_r($row); $result->free(); } $m->close(); Вывод(часть): Код (Text): Array ( [0] => Array ( [0] => 1951 [1] => 10370 ) [1] => Array ( [0] => 2210 [1] => 11464 ) [2] => Array ( [0] => 3660 [1] => 17617 ) ) Array ( ) Array ( [0] => Array ( [0] => 3795 [1] => 18406 ) [1] => Array ( [0] => 4472 [1] => 21359 ) ) Array ( [0] => Array ( [0] => 2512 [1] => 12675 ) [1] => Array ( [0] => 4699 [1] => 22171 ) )
условие в твоем WHERE вычисляется столько раз, сколько у тебя строк в sram. поэтому "истина" может срабатывать сколько угодно раз, от ни одного до всегда ))) вычисли нужное значение ДО запроса и подставляй готовый результат Добавлено спустя 5 минут 4 секунды: попробуй так: Код (Text): select sram.* from sram, (select floor(rand() * max(id)) + 1 as id from sram) as computedonce where sram.id=computedonce.id