如何根据字段中的字符串位置优先选择LIKE查询?

时间:2011-06-07 13:01:08

标签: mysql sql sql-like

我正在尝试在表中查询有限的结果集,以便在javascript中填充自动填充字段。因此,我使用LIKE运算符输入了部分字符串。

例如,如果我有一个表格,如:

tblPlaces
id     country
1      Balanca
2      Cameroon
3      Canada
4      Cape Verde
5      Denmark

为了这个例子,假设我想要返回两行 - 是的,对于这个例子,我在那里组建了一个国家;)我想优先考虑在国家开头匹配部分字符串的任何实例。我开始使用的查询是:

SELECT id, country FROM tblPlaces WHERE country LIKE 'ca%' LIMIT 2

这按预期返回'喀麦隆'和'加拿大'。但是,如果没有两个名称在一个单词的开头匹配字符串(例如'de'),我希望它在单词的其他地方查找。所以我将查询修改为

SELECT id, country FROM tblPlaces WHERE country LIKE '%ca%' LIMIT 2

然后返回'佛得角'和'丹麦',但这样做打破了我原来的'ca'搜索,现在返回'Balanca'和'喀麦隆'。

所以,我的问题是,如何使用单个查询来优先处理单词开头的匹配(也许我需要使用REGEXP?)我也假设如果'country'列是索引后,这些匹配将至少以随后的字母顺序返回(即加拿大之前的喀麦隆等)。

1 个答案:

答案 0 :(得分:10)

如果您的意思是优先考虑一开始就是正确的匹配......

SELECT id, country
FROM tblPlaces
WHERE country LIKE '%ca%'
ORDER BY CASE WHEN country LIKE 'ca%' THEN 0 ELSE 1 END, country
LIMIT 2

修改

更通用,可能更快(假设“更接近开始'更好'匹配”)...

SELECT id, country
FROM tblPlaces
WHERE country LIKE '%ca%'
ORDER BY INSTR(country, 'ca'), country
LIMIT 2