2012-01-31 2 views
0

Я знаю, что есть simmilar вопросов там, но здесь `s моя реализация на скоростную случайный выбор строки:MySQL выбрать случайную строку из двух соединенных таблиц

SELECT i.id, i.thumb_img, i.af, i.width, i.height 
FROM images_detail id 
JOIN images AS i ON id.imageid = i.id 
WHERE id.imageid >=1 
AND id.newsroom =1 
AND i.width > i.height 
AND id.imageid >= FLOOR(1 + RAND() *23111593) 
LIMIT 1 

Проблема с этим запросом является то, что равнодушный выражение RANDOM в id.imageid >= FLOOR(1 + RAND() *23111593) всегда возвращает тот же идентификатор, почему? Любая помощь, пожалуйста?

Позже изменения:

Запрос занимает 0,0005 секунды, используя EXPLAIN, оно возвращает назад USING WHERE и 12993 ROWS вернулся

Идентификатор являются автоинкрементным, это не 23111593, потому что RAND() возвращает 0.xxxxx так RAND() * 23111593, возвращает около 12993 строк. Проблема в том, что тот же идентификатор находится наверху, и я не хочу вызывать предложение ORDER BY.

+0

Сколько результатов возвращается, если вы снимаете лимит и раздел RAND в разделе where? – malonso

+0

@malonso Я отредактировал мое сообщение, чтобы включить дальнейшие подробности. Благодаря! – Gabriel

+0

Как насчет распределения изображений? Возможно, у всех изображений есть идентификаторы> 23111593? – bububaba

ответ

1

http://www.greggdev.com/web/articles.php?id=6

или использовать

ORDER BY RAND() LIMIT 0,1;

+0

очень медленный, особенно в отношении нескольких миллионов строк: P, используя EXPLAIN, указывает, что ИСПОЛЬЗОВАНИЕ ВРЕМЕННОГО, ИСПОЛЬЗУЯ FILESORT ... BAD – Gabriel

0

У вас есть какой-либо «образный» в вашей базе данных, который больше определенного вами диапазона (1 < = X < = 23111593)?

У вас может быть только одна запись в БД.

(также, иметь в виду, что вы можете иметь только один, который на самом деле соответствует запрос о id.newsroom = 1, i.width> i.height и т.д.)

+0

есть 12000, которые соответствуют условиям WHERE выше – Gabriel

0

В конце концов я загрузила все результаты в массиве, сохранил его в кеше и сделал в PHP $key=rand(0,sizeof(array)), а затем использовал его следующим образом: array[$key]['property']

Смежные вопросы