所以,我想在MySQL數據庫上查詢,但是,我希望結果是隨機的 - 也就是說,我不希望每次都以相同的順序出現相同的結果。這是因爲我只會列出查詢的前6個項目(或者在某些情況下是2個項目),並且我希望數據庫的所有內容都有機會出現。隨機MySQL查詢?或者隨機化一個結果?
是否有可能在MySQL中做到這一點,或者我必須使用PHP來做到這一點?
所以,我想在MySQL數據庫上查詢,但是,我希望結果是隨機的 - 也就是說,我不希望每次都以相同的順序出現相同的結果。這是因爲我只會列出查詢的前6個項目(或者在某些情況下是2個項目),並且我希望數據庫的所有內容都有機會出現。隨機MySQL查詢?或者隨機化一個結果?
是否有可能在MySQL中做到這一點,或者我必須使用PHP來做到這一點?
對於一個快速的方法試試這個:
SELECT *
FROM (
SELECT @cnt := COUNT(*) + 1,
@lim := 10
FROM t_random
) vars
STRAIGHT_JOIN
(
SELECT r.*,
@lim := @lim - 1
FROM t_random r
WHERE (@cnt := @cnt - 1)
AND RAND(20090301) < @lim/@cnt
) i
請參見本文的它是如何工作的詳細介紹:
一種更簡單(但緩慢的方式)是使用ORDER BY RAND()
:
SELECT *
FROM yourtable
ORDER BY RAND()
LIMIT 6
...你可以檢索隨機順序排這樣的:
mysql> SELECT * FROM tbl_name ORDER BY RAND();
ORDER BY RAND()與LIMIT結合是選擇一個隨機抽樣有用從一組行開始:
mysql> SELECT * FROM table1, table2 WHERE a=b AND c<d -> ORDER BY RAND() LIMIT 1000;
RAND()並不意味着是ap錯誤的隨機生成器。這是一種快速生成隨需數據的方式,可以在相同MySQL版本的平臺之間移植。
如果你有獨特的id
場是從1更在[1,N]選擇六張隨機數和獲取的六排與增加爲n,而不可以提高性能的任何差距IDS。這樣可以避免掃描整個表格。
這涉及全表掃描和大數據集是性能殺手 –
@Darhazer:是的,你說得對,前兩種方法需要表掃描。第三個不是,但它不是一個通用的解決方案。你有更好的答案嗎?如果是這樣,請發佈它,以便OP可以得到一些更好的解決方案! –
馬克拜爾斯是正確的這已被問過。
你想把你的隨機算法放在應用層vs數據庫層。數據庫層(假設MySQL)有巨大的性能影響。在應用程序層執行此操作將涉及一些額外的代碼,但您會發現它更加靈活,因爲您可以更新算法以適應最新的業務需求,更不用說可以實現緩存等優化。
我很肯定這是重複的。 –
因此,無論如何你都在回答問題,只有非高性能答案? – Konerak
@Konerak:如果你知道另一種性能更好的方法,請*幫助* OP併發布它,而不是僅僅抱怨其他嘗試*幫助*的人。 –