2012-06-11 35 views
2

我有一個「橫幅」表,它具有映像文件的名稱和路徑,每次訪問者導航到另一個頁面時都會隨機查看。如何從數據庫中選擇隨機ID,不包括已刪除的ID?

橫幅表由banner_id(auto_increment,unique,primary,tinyint),banner_name(varchar)和banner_path(varchar)字段組成。

橫幅表格將通過控制面板進行編輯。新橫幅將被添加,一些橫幅會在一段時間後被刪除,並且可能會被更新。一般CRUD操作,你知道...

現在...因爲我的目標是隨機顯示橫幅,我需要一個隨機數生成器函數,它可以排除特定的功能。

更清晰,

比方說,我的表看起來像這樣:

banner_id  banner_name  banner_path 
---------  ------------ ------------ 
1    First Banner first_banner.jpg 
2    Second Banner second_banner.jpg 
3    Third Banner third_banner.jpg 

我可以使用PHP函數這樣輕鬆獲得隨機ID:mt_random(1, 3);

別急。如果我刪除其中一個橫幅會怎麼樣?

banner_id  banner_name  banner_path 
---------  ------------ ------------ 
1    First Banner first_banner.jpg 
3    Third Banner third_banner.jpg 

在這種情況下,隨機輸出變爲「2」,會發生什麼情況?沒有「2」的banner_id行?所以我必須從隨機發生器號碼範圍中排除DELETED ID。這是最佳做法嗎?如果是這樣,我該怎麼做?

我完全打開任何新的想法,這將幫助我做我想做的事情。

請幫我找出這個問題...

感謝

感謝。

回答

0

假設你可以用小競賽窗口生活,你可以做

SELECT FLOOR(RAND()*COUNT(*)) AS bannercount FROM banners; 

,並提取到$bannercount此,下一次運行

SELECT * FROM banners ORDER BY banner_id LIMIT $bannercount,1 
+0

呃..我不太清楚這個答案。你能解釋一下這種方法如何給我提供隨機性? :s – scaryguy

+0

抱歉,胖手指 - 更新了我的答案。 –

+0

'#1064 - 你的SQL語法有錯誤;檢查與您的MySQL服務器版本相對應的手冊,以在'FLOOR(RAND()* 4)'附近使用正確的語法,在第1行'1' 甚至不能在phpMyAdmin SQL窗口中工作?我錯過了什麼? :s – scaryguy

0

爲什麼不選擇一個隨機行而不是使用PHP來選擇一個隨機ID來顯示?

SELECT * FROM `banners` ORDER BY RAND() LIMIT 0,1; 

如果你有ID的數組排除

SELECT * FROM `banners` 
WHERE `banner_id` NOT IN (/* array values*/) 
ORDER BY RAND() LIMIT 0,1; 
+3

因爲thiw是性能殺手創建可用的ID一個數組,生成隨機數:這將獲取所有橫幅,calclulate'RAND()'爲他們每個人,再下訂單,然後除了一個扔掉所有。 –

+0

@EugenRieck解釋它非常糟糕:) – scaryguy

1
SELECT FLOOR(RAND() * COUNT(*)) INTO @offset FROM banners; 
SELECT * FROM banners LIMIT @offset, 1;