2012-08-06 82 views
0

我使用mysql命令由蘭特PHP

$nameimg = mysql_query("SELECT * 
         FROM images 
         WHERE id='".$row['imgID']."' 
         ORDER BY RAND()  
         LIMIT 10"); 

要顯示隨機圖像由所述用戶,但它沒有顯示隨機圖像。它只是通過提交時間顯示。

+0

多少圖像是存在 - 這是什麼SELECT COUNT(*)FROM圖像WHERE ID =' 「$行[ 'imgID'。」返回? – 2012-08-06 22:15:53

+0

你可以分享'圖像'表結構嗎? – Biotox 2012-08-06 22:17:49

+0

它看起來像你只是選擇一行,或不是id colun主鍵列? – arnoudhgz 2012-08-06 22:34:32

回答

0

WHERE條件檢查ID通常會將結果集減少到一行,因此整個ORDER BY子句變得無用。

你應該考慮你的模式並重新設計查詢。

+0

我認爲這是一個user_id而不是image_id - 但我懷疑只有一行 – 2012-08-06 22:16:40

+2

@AdrianCornish:你可能是對的,但假設變量/索引有一個有意義的名字,我可能是對的; - ) – CodeZombie 2012-08-06 22:19:27

0

你應該使用PHP來隨機洗牌數組。如果現場你有興趣在被稱爲url

$req = mysql_query("SELECT url FROM images WHERE user_id = '{$row['userID']}'"); 
$images = array(); 
while($image = mysql_fetch_array($req)) { 
    $images[] = $image['url']; 
} 
shuffle($images); 
$tenImages = array_slice($images, 0, 10); 

編輯。並請考慮使用PDO prepared statements

更新。爲什麼不一次選擇一張十張圖像?

$images = array(); 
while(count($images) < 10) { 
    $req = mysql_query("SELECT url FROM images WHERE user_id = '{$row['userID']}' LIMIT " . rand(1, 10000) . ", 1"); 
    $image = mysql_result($req, 0, 0); 
    if(!in_array($image)) { 
     $images[] = $image; 
    } 
} 

有趣,速度更快的方式。提供here

$ids = array(); 
for($i = 0 ; $i < 1000 ; $i++) { 
    $ids[] = rand(1, 10000); 
} 
$req = mysql_query("SELECT url FROM images WHERE user_id = '{$row['userID']}' AND id IN (" . implode(',', $ids) . ") LIMIT 10"); 
+2

In我的意見SQL是正確的做法。你不想爲了構建一個數組而檢索很多圖像,獲取隨機圖像並立即釋放分配的內存。考慮網絡流量和內存分配時,這是沒有意義的。 – CodeZombie 2012-08-06 22:23:45

+0

我同意ZombieHunter爲什麼用SQL這種簡單的方法做到這一點很困難(不太優化,使用PHP) – arnoudhgz 2012-08-06 22:33:36

+0

顯然,如果表中包含N個圖像,SQL服務器將只生成N個隨機數需要10張圖片。此鏈接解釋了一個權衡:http://www.titov.net/2005/09/21/do-not-use-order-by-rand-or-how-to-get-random-rows-from-表/ – 2012-08-06 22:34:24