2010-08-31 68 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