SELECT foo FROM bar
WHERE id >= (abs(random()) % (SELECT max(id) FROM bar))
LIMIT 1;
我在另一個答案中看到這是ORDER BY random()的替代方法。我需要確保id
將始終大於零。我必須將>=
更改爲>
嗎?可以abs(random())%someNumberGreaterThanZero返回零嗎?
SELECT foo FROM bar
WHERE id >= (abs(random()) % (SELECT max(id) FROM bar))
LIMIT 1;
我在另一個答案中看到這是ORDER BY random()的替代方法。我需要確保id
將始終大於零。我必須將>=
更改爲>
嗎?可以abs(random())%someNumberGreaterThanZero返回零嗎?
由於x % y
返回0,當x
是y
的倍數時,答案是「是的,您的表達式可以返回0」。
因此,如果id
必須大於0,則需要使用>
而不是>=
。當然,如果模運算符沒有返回0,您仍然可以使用>
而不是>=
,並且您會得到相同的效果。
是的。如果abs(random())
返回值max(id)
,那麼模的結果將爲零。由於abs(random())
可以返回0 & 9223372036854775807之間的任何值,這是絕對有可能的。
謝謝你解釋random()的範圍。 – Louis 2011-03-08 06:00:06
是的,它可以通過兩種方式
返回0,考慮到3 % 3 == 0
,6 % 3 == 0
,等等,那麼你會得到0,如果random()
恰好是max(id)
或偶數分隔物。
random()
也可以返回0和0 % anything == 0
,這是另一種可能性。
感謝您提醒我%工作原理。 – Louis 2011-03-08 06:01:51
是的,它應該>因爲模分可以返回0(a mod a ==0
,0 mod a == 0
)。此外,您可能要檢查是否(SELECT max(id)
不爲空/ 0(a mod 0
未在某些系統中定義,或a)
聽起來像1可能永遠不會返回。 – Louis 2011-03-08 05:55:42