2011-09-28 118 views
2

我有一個類似的查詢作爲被問及這個問題如何根據相關性對mysql搜索結果進行排序?

MySQL - How to ORDER BY RELEVANCE? INNODB Table

不同的是,在這裏我想從5個字段進行搜索作爲

ADD1,ADD2,ADD3,post_town,post_code

並且只有的郵政編碼字段將不爲空,其他字段記錄可能在某些地方爲空。如果我搜索關鍵字金士頓,則返回

Acre Road, Kingston upon Thames, KT2 6EA 

Kingston Road, Epsom, KT19 0DG 

Kingston Road, Epsom, KT20 0DH 

這些結果都是各個領域ADD1,ADD2,ADD3,post_town的組合,post_code

我需要這個結果在下列順序

Kingston Road, Epsom, KT19 0DG 

Kingston Road, Epsom, KT20 0DH 

Acre Road, Kingston upon Thames, KT2 6EA 

我目前的SQL查詢是這樣

SELECT add1, add2, add3, post_town, post_code FROM address_mst 
WHERE add1 LIKE '%".$keyword."%' 
OR add2 LIKE '%".$keyword."%' 
OR add3 LIKE '%".$keyword."%' 
OR post_town LIKE '%".$keyword."%' 
OR post_code LIKE '%".$keyword."%' 

所以我需要帶搜索關鍵字的記錄一開始會先到達。我怎樣才能做到這一點 ?

回答

5

不是最漂亮的,但應該工作!

select a.* from (
SELECT add1, add2, add3, post_town, post_code, 1 as rank FROM address_mst 
WHERE add1 LIKE '%".$keyword."%' 
UNION 
SELECT add1, add2, add3, post_town, post_code, 2 as rank FROM address_mst 
WHERE add2 LIKE '%".$keyword."%' 
UNION 
SELECT add1, add2, add3, post_town, post_code, 3 as rank FROM address_mst 
WHERE add3 LIKE '%".$keyword."%' 
UNION 
SELECT add1, add2, add3, post_town, post_code, 4 as rank FROM address_mst 
WHERE post_town LIKE '%".$keyword."%' 
UNION 
SELECT add1, add2, add3, post_town, post_code, 5 as rank FROM address_mst 
WHERE post_code LIKE '%".$keyword."%' 
) a 
order by a.rank asc; 
+0

非常感謝你,這工作非常好。只是在最後一行做了一個修改,看起來更聰明 order by a.rank asc,add1,add2,add3,post_town,post_code; – aslamdoctor

1

爲什麼不選擇最小的排位賽結果與查詢,並用自己的邏輯在腳本給事先排名的權重,以你的結果和他們相應的排序?

這將幫助你:

  1. 具有更復雜的排名標準可能會或可能不會在查詢成爲可能。

  2. 如果您的排名標準發生變化,請不要編輯sql查詢。

+0

同意。我不禁覺得這是在SQL查詢之外最好解決的問題 –

1

對於基於相關性的排序,FULL TEXT SEARCH是更可靠的選項。

FULL TEXT SEARCH根據搜索到的術語的出現次數使用相關性,這些術語可能稍後用於對返回的ORDER結果進行處理。

相關問題