2012-02-17 53 views
2

我在我的網站上有一個搜索表單,允許用戶搜索公司中的員工。我正在使用輸入在mySql數據庫中搜索表。我的選擇狀態是在這裏:使用LIKE'%variable%'排序mySql結果

SELECT title, uid FROM table_data 
WHERE title LIKE '%$search_name%' AND blog_id = 6 
ORDER BY title ASC LIMIT 50 

目前,「喬恩」的搜索將導致一些,如:

Angela Jones 
Dejonas Lucero 
Ernesto Jon 
Jon White 
Rick Jonston 

有沒有辦法把它的排序順序?

search_name% 
%search_name 
%search_name% 

Jon White 
Ernesto Jon 
Angela Jones 
Dejonas Lucero 
Rick Jonston 
+0

你是問,如果你能按相關性排序?如果是這樣,您可能需要查看全文索引並與之匹配。 – 2012-02-17 01:09:29

+0

感謝您提供全文索引。我只是花了一點時間閱讀它。雖然下面的答案現在可行,但這對我來說絕對聽起來像是一個更好的解決方案。 – immd 2012-02-17 23:23:10

回答

6

這是爲了做這件事,但我覺得這是不是很優雅:

SELECT title, uid FROM table_data 
WHERE title LIKE '%$search_name%' AND blog_id = 6 
ORDER BY IF(title LIKE '$search_name%',0, 
      IF(title LIKE '%$search_name', 1, 2)) 

LIMIT 50

它給每個標題如果它匹配'search_name%',則爲'0',如果匹配'%search_name'則爲1,否則爲2(由於WHERE子句而爲'%search_name%')。

然後按它排序(升序)。

你也可以用CASE WHEN..THEN..END聲明做到這一點:

SELECT title, uid FROM table_data 
WHERE title LIKE '%$search_name%' AND blog_id = 6 
ORDER BY CASE WHEN title LIKE '$search_name%' THEN 0 
       WHEN title LIKE '%$search_name' THEN 1 
       ELSE 2 
     END 
0

您將需要發出三個單獨的查詢並連接結果集。你可以做一個查詢,如下所示:

SELECT '1' as q, title, ... WHERE title LIKE '$search_name%' ... 
UNION 
SELECT '2' as q, title, ... WHERE title LIKE '%$search_name' ... 
UNION 
SELECT '3' as q, title, ... WHERE title LIKE '%$search_name%' ... 
ORDER BY 1,2