2012-11-15 43 views
2

我有一個mysql-db上的ajax搜索。例如:搜索「男人」我與查詢:ORDER BY字開頭或內部字段

SELECT id FROM table WHERE name LIKE '%man%; 

我現在要排序的結果有開始按字母順序搜索的所有結果:在那之後我想

man 
mankind 

所有結果都按照字母順序搜索INSIDE,如:

iron man 
woman 

我該怎麼做?

回答

6

您可以通過搜索項的字符串中的位置順序:

SELECT id 
FROM table 
WHERE name LIKE '%man%' 
ORDER BY INSTR(name, 'man'), name 

參見:INSTR()LOCATE()

你也可以改變表達式只能區分字符串的開頭或其他地方:

ORDER BY IF(INSTR(name, 'man'), 1, 0) 
+1

+1比我的CASE更簡單。 –

2

您可以使用CASE語句構造您的ORDER BY以驗證子字符串。注意:這裏我使用UPPER()將搜索值和列值都轉換爲大寫,以進行不區分大小寫的匹配。如果這不是您的需要,請刪除UPPER()

ORDER BY 
    CASE 
    /* Matches the start of the string */ 
    WHEN UPPER(LEFT(name, 3)) = 'MAN' THEN 1 
    /* Doesn't match the end or the start (in the middle) */ 
    WHEN UPPER(RIGHT(name, 3)) <> 'MAN' THEN 2 
    /* Matches the end of the string */ 
    WHEN UPPER(RIGHT(name, 3)) = 'MAN' THEN 3 
    ELSE 4 
    END, 
    /* Then order by the name column */ 
    name 

這種方法應該是相當便攜的,但我喜歡下面更好INSTR()答案。

1

試試這個

SELECT id FROM table WHERE name LIKE 'man%'; 
UNION 
SELECT id FROM table WHERE name LIKE '%man%'; 
+0

我一開始也以爲是同一件事......但是當你命令......它是由工會返回的整個集合......所以同樣的問題 - 這不會返回重複...作爲UNION刪除重複... UNION ALL將返回重複 – mckeejm