2012-08-16 72 views
4

當前我想要做的是從一組200中獲得30個數字的塊。例如,因爲這將與MySQL一起使用,我想選擇30個隨機數來自200張圖像數據庫的圖像。我希望能夠在限制語句中使用兩個數字(高和低),以便返回像這樣的30行數據:SELECT * FROM 'images' LIMIT 20,50SELECT * FROM 'images' LIMIT 10,40。我知道這可能聽起來像一個愚蠢的問題,儘管我的大腦現在剛剛好了。所有幫助非常感謝!謝謝:)從200個數字中選擇一個隨機大小的30個數字

+0

圖像數量是否會顯着增加到200以上?這些數據是否經常要求? – 2012-08-16 02:42:39

+0

是的,它會增長,因爲我將使用'num_rows'來代替200. – 2012-08-16 02:44:17

回答

3

只需將ORDER BY RAND()添加到您的查詢。它是「充分」隨機的。

SELECT FOO FROM BAR ORDER BY RAND() LIMIT 30 
+0

order by rand()是一個反模式,所以不應該在沒有兩次思考的情況下使用它。 – 2012-08-16 02:43:36

+0

'SELECT 30 FROM'圖像'ORDER BY RAND();'從圖像表中選擇30個隨機圖像,然後? – 2012-08-16 02:46:31

+0

感謝編輯@Brad。從我的移動如此有限的編輯選項回答。 – 2012-08-16 02:47:09

1

我建議使用PHP的array_rand()。無論你想從一個陣列中選擇,並讓它挑選20項爲您

http://php.net/manual/en/function.array-rand.php

看跌。然後,您可以使用任何您想要的文件名,而不必依賴它們的編號順序。

+0

還要注意,這是一個PHP解決方案。這就是你的問題被標記爲。如果您想要一個SQL解決方案,請與Burhan的示例一起使用。 – Brad 2012-08-16 02:42:37

2

使用ORDER BY RAND()被認爲是因爲你迫使數據庫執行全表掃描和昂貴的排序操作的反模式。

從查詢緩存中受益,可以作出這樣一個混合解決方案:

// take all image ids 
$keys = $db->query('SELECT image_id FROM images')->fetchALL(PDO::FETCH_COLUMN, 0); 

// pick 30 
$random_keys = join(',', array_rand(array_flip($keys), 30)); 

// query those images only 
$values = $db->query("SELECT * FROM images WHERE image_id IN ($random_keys)")->fetchAll(PDO::FETCH_ASSOC); 

以上查詢鍵可以在PHP緩存,因此它可以用於更頻繁的請求。 但是,當你的表格變得在100k或更多的範圍內時,我建議用隨機順序創建一個帶圖像ID的單獨表格,你可以加入圖像表格。您可以使用ORDER BY RAND()每天填充一次或幾次。

+0

從長遠來看,這會更快,然後使用'$ query =「SELECT * FROM'images'ORDER BY RAND()LIMIT 30;」;'我唯一擔心的是,當數據庫變大時,查詢將花費更長的時間來執行。 – 2012-08-16 02:57:24

+0

@scjosh使用'ORDER BY RAND()'將強制進行全表掃描和手動排序,所以如果你的表增長很大,並且你需要經常訪問這些信息(即每次請求),我的方法會更好,因爲你可以在PHP中緩存圖像id。 – 2012-08-16 02:59:01

+1

@scjosh當你的表增長超過幾十行時,你應該考慮用隨機鍵創建一個單獨的表,你可以加入圖像表;您可以使用rand()命令每天構建表,因爲它只運行一次:) – 2012-08-16 03:02:01

相關問題