2011-01-10 54 views
0

我目前正在一個網站上顯示在線商店列表, 每個商店都將存儲在我的數據庫中,我將使用PHP來選擇並顯示它們。PHP>按名稱排序查詢結果,同時讓每個字母有時位於頂部

但是既然這些商店會支付我的費用,我想讓每個商店有時候都在排行榜的頂端, (例如,如果商店名稱以「Z」開頭,他們可能會抱怨所有時間都在列表底部,所以我想保持公平)。

所以我想讓每個字母在列表的頂部一個小時,但我不知道該怎麼做.. 這甚至可能嗎?

在此先感謝!

+1

還有一點需要記住的是,即使您希望對開店者「公平」,您也希望保持網站與您v的一致性isitors。如果你的訪客不斷尋找到商店的鏈接,因爲它不斷移動,他們會感到沮喪,可能不會使用你的網站。在我看來,您需要找到一種方式來對開店者「公平」,同時爲訪客保持一致的體驗。 – 2011-01-10 16:40:33

回答

2

我會顯示一個單獨的盒子,並在它只是一個商店把它稱爲「當今的挑」什麼類型的這一點很快的。這樣,您可以偶爾將以「Z」開頭的商店推到頂部,同時保持用戶正常排序的商店列表體驗。

然後使用數據庫來保存哪個商店已經在「今天的選擇」框中多少次,讓他們都平等。

0

在沒有爲模式添加「優先級」字段的情況下(雖然有可能,它最多隻會令人費解),但直接在SQL中處理這個問題並沒有任何理智的方法(我知道)。這就是說,這裏有兩個建議:

修改您的模式

一個簡單的「優先權」字段添加到相關模式和按優先級排序,姓名(或任何默認是)。您當然需要每小時重置優先級字段,但這是一項相當平凡的任務。

處理它在PHP

  1. 開展查詢按往常一樣。

  2. 將所有結果都抓取到數組中。

  3. 根據當前小時根據需要重新排列優先順序。 (您需要array_splice您想要從陣列中跳出的項目,然後array_unshift將它們置頂。)

  4. 基於數組的輸出。

這當然會變得更復雜/效率更低,如果你需要處理分頁,但基本的想法是相同的。

0

一個很好的解決方案是將另一列添加到帶有商店名稱的數據庫中,並將其稱爲「last_shown」,然後當您顯示該商店時,使用時間戳更新列,並且每個選擇都執行如下操作:

「SELECT名稱,連接距離商店ORDER BY last_shown DESC」

然後在PHP你可以檢查

<?php 

if($row['last_shown']+3600 > now()){ 
    //run select but in ASC order 
    //update the new row's column to the current timestamp 

} 



?> 

這樣,它只會更新一次一小時,但除此之外,它會繼續選擇在列表頂部購物R上的小時

抱歉它是一個有點亂,我只是在工作

0

如圖所示店可以在架構 2)order by shown_times asc 3)&添加 1)額外列shown_times你會+1

另一種解決方案: 你甚至可以使用ORDER BY RAND()

相關問題