2014-03-24 132 views
1

我想從一個非常簡單的表中隨機選擇一個用戶來生成樣本數據。無法從MySQL表中選擇一個隨機行

該表只有兩列,即整數主鍵users_id,其中所有值從1到46(含),而unamevarchar(60)

查詢

select relusers.uname from relusers where relusers.users_id=floor(rand()*46+1); 

將返回多行。也許我一直在盯着這個太久,但我沒有看到上面的查詢如何返回多行。 floor()返回一個正在與主鍵列進行比較的整數。在選擇中包含users_id會顯示多個不同的ID被選中。因爲我可以理解零行,但多個?有任何想法嗎?

+0

不知爲何,你不執行where子句... –

+0

我相信每一行的重新計算蘭特,所以如果你有46行,它將計算蘭特46次,並返回它匹配的那些行。 – deanosaur

+0

就是這樣 - 謝謝@deanosaur – netopiax

回答

3

您的代碼正在返回多個行,因爲rand()在每一行都被評估。所以,你有多個匹配的變化。而且根本沒有比賽的機會。

你可以使用你的想法,但嘗試這樣說:

select relusers.uname 
from relusers cross join 
    (selext @rand := rand()) const 
where relusers.users_id = floor(@rand*46+1); 

這會產生只有一個隨機值,因此只有一行。但是,只有46行,該order by方法應該執行不夠好:

select relusers.uname 
from relusers 
order by rand() 
limit 1; 
0
select * from relusers order by rand() limit 1 
+0

儘管這樣做有效(儘管我相信對於大型數據集可能會慢很多 - 我不會使用它) - 我很樂意解釋我的版本出了什麼問題。 – netopiax

+0

Hi @BrianDeMilia嗨@BrianDeMilia - 你對網站並不陌生......你應該知道,爲解決問題提供解決方案原因的詳細信息是一個不錯的主意 - 不要忘記,很多n00bs會出現問題/答案,並希望瞭解爲什麼以及如何運作。 :) –

相關問題