2012-04-29 45 views
4

我正在嘗試創建一個過濾器來顯示某些被認爲是「趨勢」的記錄。因此,這個想法是選擇重要的投票記錄,但不是從大多數投票到最不投票的降序排列。這樣用戶就可以瀏覽並有機會看到所有鏈接,而不僅僅是頂部的鏈接。你認爲最好的方法是什麼?我失去了如何創建一個隨機分類的趨勢鏈接,但沒有讓他們重複,因爲用戶從一頁頁到另一頁。有什麼建議麼?如果有任何不清楚的地方,請告訴我,謝謝!如何在Mysql和PHP中創建「上升」或「熱門」查詢?

+2

首先 - 定義你認爲會是一個很好的排序順序。這是你的應用程序真正的肉 - 那麼你可以得到一些SQL的幫助。 – Randy

+0

排序順序是什麼意思? –

回答

0

也許創建一個新的列來記錄它有多少個視圖?然後在每次有人查看它並通過具有最大數量的視圖的線程進行排序時更新它。

+0

雅,這個想法是不顯示按順序從上到下,但隨機的種類,但從高到低,這是否有道理?因此,第一頁顯示可以查看800-900以及700-800以下的任何地方,請參閱? –

+1

使用array_rand()。將800-900行放入一個php數組中,並獲取array_rand()來隨機排序它們。這些行將使用array_rand()的順序放在頂部。對每個範圍重複此操作。 –

+0

當然,但如果我只想每頁顯示25個結果,並且我不想重複結果,但我想向他們展示我所做的一切。 –

2

此回覆假定您爲每次投票在每個子表格中跟蹤投票,而不是僅在特定項目上+1。

確定您關心熱門話題的時間範圍。也許1個小時會很好?

然後運行查詢以確定哪個項目在過去一小時內獲得最高票數。按此計數排序,您將持續更新最新的最新項目清單。

SELECT items.name, item_votes.item_count FROM items 
INNER JOIN 
(
    SELECT item_id, COUNT(item_id) AS item_count 
    FROM item_votes 
    WHERE date >= dateAdd(hh, -1, getDate()) AND 
      ## only count upvotes, not downvotes 
      item_vote > 0 
    group by item_id 
) AS item_votes ON item_votes.item_id = items.item_id 

ORDER BY item_votes.item_count DESC 
+0

我承認我完全不瞭解這個查詢,但是我要找的是更多的隨機性,所以它會顯示投票主題,但不會按照確切順序列出。所以基本上找到了10%的最高票數,並顯示從普通高票到低票隨機出現超過5頁。但沒有重複的結果。 –

1

你提的是,你不想重複的項目超過幾頁,這意味着你不能得到隨機排序每個請求。您將需要檢索項目,對它們進行排序,並將它們保存在服務器範圍內或會話特定的緩存中。

服務器範圍內的緩存需要每隔一段時間更新一次,這是您需要定義的時間間隔。發生此更新時切換頁面的用戶將看到他們的項目被加密。

只要用戶瀏覽您的網站,特定於會話的緩存就會維護這些項目,這意味着如果您的用戶永遠不會離開,這些項目將會過期。再一次,您需要確定執行更新的時間間隔。

我在想你需要一個版本清單。你可以做服務器級的緩存解決方案,並給它一個版本(日期,整數,任何東西)。瀏覽最新趨勢時,您需要通過此版本,並且用戶將繼續查看相同的列表。點擊趨勢菜單鏈接將把它們發送到沒有版本信息的瀏覽頁面,這些信息應該從緩存中獲取最新信息。只要用戶正在瀏覽這些頁面,您就可以保留這些內容。

我不能進入sql語句,不是因爲它們很難,但我們不知道你的數據庫結構。你是否在單獨的表格中跟蹤個人投票?他們只是聚合成一個列?

+0

我有一張表來跟蹤用戶投過來的每一篇文章,關於服務器端緩存的唯一問題如果您有數千篇文章,會發生什麼?無論您需要分類的物品數量多少,您只需要運行這項工作?你怎樣才能把組織保存在一個表格中? (對不起,如果這是很多問題,只是想學:) :) –

+0

這取決於數據庫檢索匹配,你需要適當的索引設置。您的代碼中完成的排序僅適用於數據庫中返回的帖子的小部分。從數據庫返回的一千個帖子是一個很小的數量,你應該能夠訂購它,而不必擔心速度。然後,您可以將結果作爲帖子標識符列表進行緩存,也可以將內容呈現爲html,並在請求時向用戶顯示。你在談什麼類型的組織? – sisve