2009-04-20 66 views
1

我目前顯示所有條目的隨機行,並且工作正常。顯示最近100個條目的隨機行嗎?

SELECT * FROM $db_table where live = 1 order by rand() limit 1 

現在,我想限制它在數據庫中的最後100個條目。

db中的每一行都有一個ID和一個時間戳。

這是一個小型數據庫,所以開銷最小化並不是優先事項。

謝謝!

編輯:

仍然不能得到它運行..我得到一個錯誤mysql_fetch_array:

"Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource 

這裏是我的所有代碼:

<?php $sql = "SELECT * FROM 
(SELECT * FROM $db_table ORDER BY $datetime DESC LIMIT 100) 
ORDER BY rand() LIMIT 1"; 
$query = mysql_query($sql); 
while($row = mysql_fetch_array($query)) { 

echo "".$row['familyname'].""; 

} ?> 

再次感謝!

+0

你應該做的回聲mysql_error()的while()循環之前確定有什麼錯查詢。 – cmptrgeekken 2009-04-20 03:08:53

回答

4

這就是我從頭頂上想出來的。我已經測試過它,它在SQLite中起作用,所以你不應該對MySQL有太多麻煩。唯一的變化是,SQLite的的隨機函數是隨機的()不蘭特():

SELECT * FROM 
    (SELECT * FROM $db_table ORDER BY $timestamp DESC LIMIT 100) 
ORDER BY rand() LIMIT 1 
+0

rand()的ORDER究竟幹什麼?在使用這種隨機化方法的mysql.com論壇中,似乎有很多關於性能問題的抱怨,儘管這些抱怨可能來自設計不佳的查詢或數據庫。 – Calvin 2009-04-20 01:51:17

1

This page對如何優化的ORDER BY RAND()型查詢一個相當詳細的書面記錄。實際上,對於我來說,要充分解釋SO(也不完全理解所用的一些SQL命令,儘管一般概念有意義),但最終優化的查詢使用幾種優化:

  1. 首先,在整個表上使用filesort算法的ORDER BY RAND()被丟棄。相反,查詢被構造成簡單地生成單個隨機ID。
  2. 在這個階段,正在使用一個index scan,在很多情況下它的效率比filesort更低,所以這是通過子查詢優化的。
  3. WHERE子句被替換爲JOIN以減少由外SELECT讀取的行數,並執行該子查詢的次數,僅僅1
  4. 爲了考慮在IDS孔(從刪除)並確保平等分配,創建映射表以將行號映射到ID。
  5. 觸發器用於自動更新和維護映射表。
  6. 最後,創建存儲過程以允許一次選擇多行。 (在此,ORDER BY重新引入,而只是對結果行使用。)

下面是表現人物:

  • Q1。 ORDER BY RAND()
  • Q2。 RAND()* MAX(ID)
  • Q3。RAND()* MAX(ID)+ ORDER BY ID
 
    100  1.000  10.000  100.000 1.000.000 
Q1 0:00.718s 0:02.092s 0:18.684s 2:59.081s 58:20.000s 
Q2 0:00.519s 0:00.607s 0:00.614s 0:00.628s 0:00.637s 
Q3 0:00.570s 0:00.607s 0:00.614s 0:00.628s 0:00.637s