2013-03-26 196 views
0

我的搜索查詢的運行,如:PHP MYSQL搜索

select * from posts p where p.post like '%test%' ORDER BY p.upvotes DESC, 
p.unix_timestamp DESC LIMIT 20 

如果有超過20個結果所搜索的關鍵詞,我找出最低時間戳值,將其存儲在一個隱藏的元素並運行另一個查詢加載喜歡更多結果:

select * from posts p where p.post like '%test%' and p.unix_timestamp < 1360662045 
ORDER BY p.upvotes DESC, p.unix_timestamp DESC LIMIT 20 

請告訴我實際發生的是我的第一個查詢忽略(很顯然,我的失誤),因爲我ORDER BY p.upvotes DESC的已經沒有任何票(指0票)職位作爲這個的結果,我注意到它提取了在前20個結果中表中的第一個帖子,所以最小時間戳成爲第一個帖子的時間戳。在此之後,如果我嘗試獲取小於最小時間戳的下一個20個結果,它不會給出任何結果。

現在,我只是使用upvotes命令來獲取最高記錄。我應該使用貝葉斯平均法還是其他一些算法?

請告訴我如何改善查詢,如果我不得不留在當前的訂購系統或有任何可行的和更有效的方法,我應該使用?

P.S.如果可能的話,請參考一些有關貝葉斯平均值(似乎是最常用的)或其他替代方法的資源?

+1

您的第一個查詢不應忽略0 upvotes的帖子,但會開始顯示所有帖子,包括0 upvotes的帖子,從具有最大upvotes的帖子開始。如果所有有upvotes 0它將按時間戳排序。我想念什麼?附:您應該將已達到的upvotes值也存儲在隱藏字段中,並將其傳遞給第二個查詢。 – 2013-03-26 09:48:38

+0

我不是一次性獲取匹配搜索關鍵字的所有帖子,而是在大量20次的情況下進行匹配。因此,它忽略了第一個查詢本身有0個upvotes的情況,以及一個情況下最小時間戳的情況的第一個20的結果是表中的第一個職位,因爲在第二個查詢中沒有找到任何東西。 – coder101 2013-03-26 09:51:29

+1

你的查詢沒有任何建議它會忽略0 upvotes。您提供的查詢會顯示它們 – 2013-03-26 09:54:05

回答

0

存放時間戳當您第一次做一個搜索,然後使用下一個查詢,你可以使用這樣的事情: -

$sql = "SELECT * 
FROM posts p 
LEFT OUTER JOIN (SELECT post_id, COUNT(*) FROM post_ratings WHERE timestamp_rated <= $SomeTimeStoredBetweenPages GROUP BY post_id) pr ON p.id = pr.post_id 
WHERE p.post like '%test%' 
ORDER BY pr.post_ratings DESC, p.unix_timestamp 
DESC LIMIT ".(($PageNo - 1) * 20)." 20"; 

這是非常一個例子,因爲我有你沒有真正的想法表結構。也不確定是否每個投票都有一排,或者是否有投票也要考慮。

+0

downvotes也有,並有upvotes以及downvotes特定的行。表格結構與您的建議完全相同。 – coder101 2013-03-26 10:48:31

+0

我想你假設我正在做分頁這就是爲什麼變量'$ pageNo',但我只是在最後加載鏈接加載更多的結果。那麼,我如何將你的查詢放入我的結構? – coder101 2013-03-26 11:01:09

+0

您可以在子查詢中僅添加一個檢查行,該行是upvote還是downvote作爲WHERE子句。通過給出「更多記錄」的鏈接,你實際上正在做分頁。只需在該鏈接的末尾添加一個變量作爲頁碼(默認爲1)。 – Kickstart 2013-03-26 13:39:12