2012-06-21 64 views
18

我有以下查詢:按最強LIKE訂購SQL?

SELECT * FROM table_name 
WHERE (col_1 LIKE '%$keyword%' 
    OR col_2 LIKE '%$keyword%' 
    OR col_3 LIKE '%$keyword%') 
    AND .... <some optional filters> ... 

是有戰略排序基於最相關的結果?

+1

通過 「最相關」 ,你的意思是'col_1'上的匹配優先於'col_2'上的匹配,等等? – Wiseguy

+0

什麼構成最相關的結果? – codewaggle

+0

您的意思是「過濾」而不是「排序」? – Sebas

回答

26

當你談論「相關「,你真的想自然語言搜索,這是MySQL full-text searches支持。語法與正常的不同,如查詢,您需要向該表添加特殊索引,但按相關性排序可能是這種方式。

這裏的MySQL如何計算的相關性(從鏈接):

當MATCH()在WHERE子句中使用,如在前面的例子中,返回的行會自動與關聯性最高的第一排序。相關性值是非負浮點數。零相關意味着沒有相似性。相關性的計算基於行中單詞的數量,該行中唯一字的數量,集合中單詞的總數以及包含特定單詞的文檔(行)的數量。

create a full-text index on an existing table,使用FULLTEXT修改:

CREATE FULLTEXT INDEX index_name 
ON table_name (col1, col2, col3) 

然後你就可以這樣執行查詢檢索的相關性順序結果:

SELECT * FROM table_name 
WHERE MATCH (col1,col2,col3) 
AGAINST ('keyword' IN NATURAL LANGUAGE MODE); 
3

你不能。您正在要求RDBMS按最下面的「LIKE」列降序排列結果。例如,MySQL使用所謂的FULLTEXT索引來執行此操作。

28

如果你的意思是COL_1比COL_2更相關的等等,那麼:

select * 
     ,case when col_1 like '%$keyword%' then 1 
      when col_2 like '%$keyword%' then 2 
      when col_3 like '%$keyword%' then 3 
     end as [priority] 
    from table_name 
where col_1 like '%$keyword%' 
    or col_2 like '%$keyword%' 
    or col_3 like '%$keyword%' 
order by [priority] 

如果您用最柱匹配,則意味着:

select * 
     ,(case when col_1 like '%$keyword%' then 1 else 0 end) + 
     ,(case when col_2 like '%$keyword%' then 1 else 0 end) + 
     ,(case when col_3 like '%$keyword%' then 1 else 0 end) as [priority] 
    from table_name 
where col_1 like '%$keyword%' 
    or col_2 like '%$keyword%' 
    or col_3 like '%$keyword%' 
order by [priority] desc 
+3

用於創建自定義排名的+1 – Wiseguy

+0

剛剛測試過,您不需要子查詢,即可更新答案。 –

+4

不知道它是否僅僅是我,但是我必須從'[priority]'**的加號(_ + _)**和**括號(_ [] _)後面刪除**逗號代碼工作。 – Giraldi