2010-08-31 85 views
20

假設我們正在執行使用搜索關鍵詞:關鍵詞1,關鍵詞,KEYWORD3Mysql:按類似命令?

有在數據庫中的記錄與列 「名」:

 
1: John Doe 
2: Samuel Doe 
3: John Smith 
4: Anna Smith 

現在查詢:

SELECT * FROM users WHERE (name LIKE "%John%" OR name LIKE "%Doe%") 

它會選擇記錄:1,2,3(按此順序) 但我想在關鍵字 中訂購它,例如keyword1=John, keyword2=Doe 所以應該按關鍵字列出: 1,3,2(因爲我想搜索「約翰」後「母鹿」進行搜索)

我在想SELECT DISTINCT FROM (...... UNION .....) 但它會更容易以另一種方式在某種程度上訂購吧(實際查詢真的很長)

是否有任何技巧來創造這樣的秩序?

回答

46
order by case 
    when name LIKE "%John%" then 1 
    when name LIKE "%Doe%" then 2 
    else 3 
end 
+0

是的,工作,謝謝:) – dfens 2010-08-31 12:55:45

+0

還有一件事 - 如果我理解正確,每個LIKE將在整個查詢中執行2次? – dfens 2010-08-31 13:05:10

+0

@dfens:我猜'ORDER BY'子句中的'LIKE'只會對'WHERE'子句匹配的數據執行,所以應該更快。 – RedFilter 2010-08-31 13:55:02

2
SELECT * 
from 
(
    SELECT u.*, 1 OrderNum 
    FROM users 
    WHERE (name LIKE "%John%") 
    UNION 
    SELECT u.*, 2 OrderNum 
    FROM users 
    WHERE (name LIKE "%Doe%") 
) 
    Order by OrderNum 
2

要建立在RedFilter的答案,你可以做有兩個關鍵字在頂部行:

order by case 
when (name LIKE "%John%" and name LIKE "%Doe%") then 1 
when name LIKE "%John%" then 2 
when name LIKE "%Doe%" then 3 
end 
0

我的例子將責令所有按字母順序其次DoeJohn的的的。

ORDER BY CASE 
    WHEN name LIKE "John%Doe" THEN CONCAT('a',name) 
    WHEN name LIKE "John%" THEN CONCAT('b',name) 
    WHEN name LIKE "%Doe"  THEN CONCAT('c',name) 
    ELSE name 
END