2012-12-18 93 views
5

我有一個數據庫充滿了圖像,我想吐出並顯示兩個隨機圖像。這段代碼正確地做了,但我不相信這是最好的方法,特別是如果數據庫最終會有很多行。我研究過使用MySQL的rand()函數並將其限制爲兩個結果,但從我讀取的rand()在大型數據庫上相對較慢。另一個問題是在雙重數據庫查詢中。有沒有更好的方法通過img_id選擇兩個隨機行?在MySQL數據庫中選擇兩個隨機行

img_id是一個auto_incremented行,但不能被認爲是連續的。

//get all image ids 
$query = $conn->prepare('SELECT img_id FROM images'); 
$query->execute(); 
$result = $query->fetchAll(); 

//create an array in which to put all the ids 
$list_imgs = array(); 

//put the ids into the array to search over 
for ($x=0; $x < count($result); $x++) { 
    array_push($list_imgs, $result[$x]['img_id']); 
} 

//output two random images 
for ($x=0; $x < 2; $x++) { 
    //create random index for search 
    $rand = array_rand($list_imgs); 

    //query to select one image 
    $query = $conn->prepare('SELECT title, file_loc FROM images WHERE img_id=?'); 
    //random index value in array of img_ids 
    $query->execute(array($list_imgs[$rand])); 
    $result = $query->fetchAll(); 

    echo 'title:' . $result[0]['file_loc'] . '<br /><img src="' . $result[0]['file_loc'] . '" />'; 
} 

任何建議,使查詢更有效率?

+0

有你在蘭德測試用'爲了一個查詢()'對3個詢問你現在有嗎?順便說一句,您可以通過將'prepare'語句移出循環來使當前代碼更高效,您只需要準備一次。 – jeroen

+0

你可以直接從'$ result'中選擇兩個隨機行,不需要生成一個具有相同值的新數組... – jeroen

回答

5

你可以使用

SELECT img_id, title, file_loc FROM images order by rand() limit 2 

所以你會最終

$query = $conn->prepare('SELECT img_id, title, file_loc FROM images order by rand() limit 2'); 
$query->execute(); 
$result = $query->fetchAll(); 

foreach($result as $row) { 
    echo 'title:' . $row['file_loc'] . '<br /><img src="' . $row['file_loc'] . '" />'; 
} 

注意,爲了通過RAND()可以在大表特別慢。請參閱How can i optimize MySQL's ORDER BY RAND() function? 關於優化方法

+0

儘管我從來沒有測試過它,但我聽說rand()大桌子,所以我猶豫使用它。你知道這個問題是否有效? – Hat

+0

我的答案中有一個鏈接,用於優化大型數據集的方法 –

0

使用每x(您的呼叫)執行的腳本來標記要顯示的兩張圖片。

0

還不如知道這與MySQL,在MS SQL我會做:

SELECT TOP 2 img_id, newid() FROM images ORDER BY newid() 

如果在MySQL的作品與之相似這將是

SELECT img_id, uuid() FROM images ORDER BY uuid() LIMIT 2 
0

首先選擇所有圖像是矯枉過正。 。

你可以做些事情是這樣的:

SELECT file_loc 
FROM random AS r1 JOIN 
     (SELECT (RAND() * 
        (SELECT MAX(id) 
         FROM random)) AS id) 
     AS r2 
WHERE r1.id >= r2.id 
ORDER BY r1.id ASC 
LIMIT 2 

你可以檢查此文章:http://jan.kneschke.de/projects/mysql/order-by-rand/