2008-11-19 45 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; 
相關問題