2011-11-29 174 views
1

所以,我想在MySQL數據庫上查詢,但是,我希望結果是隨機的 - 也就是說,我不希望每次都以相同的順序出現相同的結果。這是因爲我只會列出查詢的前6個項目(或者在某些情況下是2個項目),並且我希望數據庫的所有內容都有機會出現。隨機MySQL查詢?或者隨機化一個結果?

是否有可能在MySQL中做到這一點,或者我必須使用PHP來做到這一點?

+0

我很肯定這是重複的。 –

+0

因此,無論如何你都在回答問題,只有非高性能答案? – Konerak

+0

@Konerak:如果你知道另一種性能更好的方法,請*幫助* OP併發布它,而不是僅僅抱怨其他嘗試*幫助*的人。 –

回答

1

對於一個快速的方法試試這個:

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 

the manual

...你可以檢索隨機順序排這樣的:

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。這樣可以避免掃描整個表格。

+2

這涉及全表掃描和大數據集是性能殺手 –

+0

@Darhazer:是的,你說得對,前兩種方法需要表掃描。第三個不是,但它不是一個通用的解決方案。你有更好的答案嗎?如果是這樣,請發佈它,以便OP可以得到一些更好的解決方案! –

0

馬克拜爾斯是正確的這已被問過。

你想把你的隨機算法放在應用層vs數據庫層。數據庫層(假設MySQL)有巨大的性能影響。在應用程序層執行此操作將涉及一些額外的代碼,但您會發現它更加靈活,因爲您可以更新算法以適應最新的業務需求,更不用說可以實現緩存等優化。