2013-02-05 86 views
1

我有這樣一個查詢多個條件:查詢和排序關聯

SELECT * FROM image WHERE name LIKE '%text%' AND group_id = 10 LIMIT 1 

的WHERE語句組成的3個條件:

  • 文本匹配
  • 匹配的外鍵

如果我想根據相關性對結果進行排序,那麼取決於:

  1. 文本的確切匹配度
  2. 滿足多少條件(例如,文本匹配外鍵)

這是一個兩個問題,但我覺得有些時候,這些會派上用場的組合。通過這個,我指的是我的一個前職位引起的問題(Way to try multiple SELECTs till a result is available?)。

在此先感謝!

回答

3

要知道文本如何匹配,您需要使用fuzzystrmatch PostgreSQL模塊。它提供的功能爲differencelevenshtein,可以給你兩個字符串之間的相似性估計。

然後,您就可以使用一些條件構建查詢:

SELECT * 
    FROM image 
WHERE name LIKE '%text%' 
    AND (group_id = 10 
     OR second_field = 4 
     OR thirth_field = 5 
     ) 
ORDER BY ((group_id=10)::int 
      + (second_field=4)::int 
      + (thirth_field=5)::int 
     ) * weight_1 
     + (strlen(name)-levenshtein('text',name))* wheight_2 

您可以調整weight_1weight_2優先考慮的對象文本距離或滿足一些條件。

+3

+1但是,爲了避免我認爲的'case'冗長,我將總結布爾值itseft像'(group_id = 10):: int + ...' –

+0

真的,它會更加簡潔這種表達 –

+0

正是我所需要的,謝謝@ oscar-perez!也許這將是很好的編輯你的答案,所以它還包括@Clodoaldo – nepa