2011-05-06 101 views
2

我在嘗試爲我的搜索結果更準確地訂購。我指定了一個搜索字符串 - 例如「北京奧運」使用MySQL查詢中的查詢

  • 如果標題欄包含「北京奧運」,那麼分數100加到得分,否則什麼都不添加
  • 如果SHORTDESCRIPTION列中包含「北京奧運會」,那麼50被添加到比分,否則什麼都不添加
  • 如果longDescription列中包含「北京奧運會」,那麼10加到得分,否則什麼都不添加

最終得分最高每條記錄可能會是160和我想要結果按排序最高得分第一,限於最多10個結果。

下面肯定是錯誤的,但它應該說明我希望實現的目標!

SELECT 
    title, 
    id, 
    (
    IF((match 'Beijing Olympics' against title)*100) + 
    IF((match 'Beijing Olympics' against shortDescription)*50) + 
    IF((match 'Beijing Olympics' against longDescription)*10) 
    ) as score 
from listings 
order by score desc limit 10 

回答

1

你可能想使用CASE
http://dev.mysql.com/doc/refman/5.0/en/case-statement.html

否則,我認爲你的選擇邏輯是罰款。

SELECT 
    title 
    ,id 
    ,(
     (CASE WHEN title LIKE '%Beijing Olympics%' THEN 100 ELSE 0 END) 
     + (CASE WHEN shortDescription LIKE '%Beijing Olympics%' THEN 50 ELSE 0 END) 
     + (CASE WHEN longDescription LIKE '%Beijing Olympics%' THEN 10 ELSE 0 END) 
    ) AS score 
FROM 
    listings 
ORDER BY 
    score desc 
LIMIT 10 

請注意,我沒有測試過這個查詢,但它應該是關閉的。

編輯:另請注意,這符合確切的價值。

+0

謝謝你的回覆。 CASE對我來說是新的! 我得到一個MySQL錯誤,即使我嘗試削減版本: SELECT標題,ID,(CASE冠軍時,「北京奧運會」,那麼100 ELSE 0)作爲評分從列表 #1064 - 你有一個您的SQL語法錯誤;檢查與您的MySQL服務器版本相對應的手冊,以便在')附近使用正確的語法作爲分值清單 – Chris 2011-05-06 16:11:56

+0

啊哈,看起來像我需要添加END – Chris 2011-05-06 16:13:42

+0

@Chris oops!編輯我的答案包括'END CASE' – Matthew 2011-05-06 16:15:43