2013-04-10 3 views
0

Pls, какой запрос мне нужно случайным образом выбрать JUST ONE ROW в моем столе?Как я могу случайно выбрать одну строку в MySQL?

Я пробовал:

SELECT * 
FROM `table` 
ORDER BY RAND() 
LIMIT 0,1; 

и, кажется, очень медленно и иногда не работает.

Благодаря

+0

Просто из любопытства ... как это иногда не работает? –

ответ

1

Если таблица большая, ORDER BY будет медленным. Вместо этого вы можете просто выбрать случайное смещение, основанное на количестве строк в таблице.

SELECT * FROM table LIMIT 1 OFFSET ? 

Где ? это какой-то случайный номер < SELECT COUNT(*) FROM table

+0

Я не могу сосчитать количество запросов, заданных этим вопросом, используя все мои цифры ;-) –

+0

Это сработало для меня. – Chykere

1

Вы можете создать STORED PROCEDURE, который содержит динамический SQL, чтобы получить случайную запись,

DELIMITER $$ 
CREATE PROCEDURE SelectOne() 
BEGIN 
    SET @rownum := (SELECT count(*) FROM TableName); 
    SET @start := (SELECT FLOOR((rand() * @rownum))); 
    SET @sql = CONCAT('SELECT * FROM TableName LIMIT ?, 1'); 

    PREPARE stmt FROM @sql; 
    EXECUTE stmt USING @start; 
    DEALLOCATE PREPARE stmt;   
END $$ 
DELIMITER ; 

благодаря Jack для улучшения :)

+0

Хорошая реализация ответа Explosion :) почему бы вам не добавить это на упомянутый обман? Хотя он предоставлен, это полезно только для выбора одного. –

+1

Ницца! Хотя, я бы использовал 'FLOOR (RAND() * @rownum)' и имел '@ rownum' равный просто' count() ', иначе вы голодаете первую запись. http://sqlfiddle.com/#!2/43948/4 –

+0

хорошая идея @Jack. позвольте мне попробовать, что ':)' –

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