2014-02-23 88 views
2

我的Mysql數據庫充滿了大約90個圖像鏈接。然而,每行的ID並不是按照時間順序排列的。例如最初它從6到20然後是我刪除了一些差距。然後它從80 - 120,然後又一個差距等。隨機和唯一的Mysql select查詢

這是一個很熱門的網站。我希望用戶能夠瀏覽全部90張圖片,而不必查看同一張圖片兩次。然而目前這種情況經常發生。相同的圖像出現兩次甚至三次。

這裏是我的選擇查詢現在:

$sql = mysql_query("SELECT * FROM `table` WHERE id >= (SELECT FLOOR(MAX(id) * RAND()) FROM `content`) ORDER BY rand() LIMIT 1"); 

有誰知道這個問題沒有更好的辦法?

+0

查看一個'WHERE()'子句。 – Shahar

回答

0

您可以存儲用戶已經看到的「事物」的ID,並將其排除在所有下一頁(通過連接或不在)中。通過這種方式,您可以隨時獲取隨機文章,而不會被數據庫中行的順序卡住(以及如果用戶稍後返回,該怎麼辦?)。

+0

好的解決方案,但我的網站不讓人們註冊。我想我可以用cookie或其他東西做到這一點 – idwes7

0

如何從數據庫中獲取所有索引,對它們進行洗牌,製作一個列表,然後將它們從一個頁面傳遞到另一個頁面,顯示最上面的一個並從列表中刪除它?

+0

我想我會用這個。但是,獲取所有的id並將它們放入會話中的數組可能會有點慢。還有更好的方法嗎? – idwes7

+0

沒有辦法告訴mysql記住你已經選擇了什麼。如果沒有閱讀你感興趣的索引(即使你將信息存儲在db而不是會話中,你仍然需要先閱讀它們):/ 如果它只是90個記錄,那麼性能不應該成爲一個問題。 – wesolyromek

0

您面臨的問題本身就是rand()。每次你打電話時,它會產生不同的順序。隨機是隨機的,因此給定的行可能會連續出現兩次。你真正想要的是一個隨機排列。

一種方法是隨機的種子,然後用limit偏移:

select * 
from table t 
order by rand(<seed value here>) 
limit <offset>, 1; 

你需要這兩樣東西的種子值。您可以通過爲每個用戶保留一個枚舉值,或者使用用戶標識符,或者每個用戶的一個整數和常量來做到這一點。

您需要的另一件事是抵消。這很重要,因爲當你得到第二個項目時,你需要確保排序與第一個項目相同。

另一種方法是首次以隨機順序獲取所有ID並將它們存儲在應用程序中。您可以使用group_concat()做到這一點:

select group_concat(id order by rand()) 
from table t; 

然後再通過這個列表,而不是返回到數據庫。