2008-11-19 41 views
4

我对mySQL数据库的写入存储函数的主题相当陌生,因此我不确定我是否可以尝试在这里完成任务。在mysql的存储函数里SELECT语句中使用变量作为OFFSET

我需要一个函数,它将从表中的随机行返回一列。我不希望使用ORDER BY RAND()方法来做到这一点,而我会做这样的:

DECLARE MAX_COUNT INT DEFAULT 120000; 
DECLARE rand_offset INT; 
DECLARE str_rnd_word VARCHAR(255); 
SET rand_offset = FLOOR((RAND() * MAX_COUNT)); 

SELECT word INTO str_rnd_word FROM all_words LIMIT 1 OFFSET rand_offset ; 

RETURN str_rnd_word; 

的MySQL在与身体一样,创建函数抛出一个错误。但是当我使用硬编码的数字作为OFFSET时,它工作得很好。

有人可以对这个问题有所了解吗?

我在windows上运行MySQL 5.0.45。 5.5前

感谢

+0

你能解释为什么“我不想使用ORDER BY RAND()方法来做到这一点”? – 2008-11-19 00:58:19

+0

因为ORDER BY RAND()方法对于性能来说很糟糕。请注意他的桌子上有120,000行。 – 2008-11-19 01:07:36

回答

2

在MySQL中,你不能把一个变量到MySQL的存储过程LIMIT条款。您必须将其插入到字符串中,然后将该字符串作为动态查询来执行。

SET rand_offset = FLOOR(RAND() * (SELECT COUNT(*) FROM all_words)); 
SET @sql = CONCAT('SELECT word INTO str_rnd_word FROM all_words LIMIT 1 OFFSET ', rand_offset); 
PREPARE stmt1 FROM @sql; 
EXECUTE stmt1; 
相关问题