Mysql搜索列开头的单词

时间:2014-12-29 15:26:02

标签: mysql sql mysqli

您的数据如下所示

ferrari motor
motor
tata motor
motor corp
hundai motor

所以当我使用这个查询时

SELECT * FROM `table` WHERE MATCH(`name`) AGAINST ('%motor' IN BOOLEAN MODE) LIMIT 10 

我按照下面的随机顺序得到结果

tata motor
motor corp
ferrari motor
motor
hundai motor

但是如果电机是开头的话,我想对它进行排序它应该优先考虑,所以我的预期结果应该如下所示

motor
motor corp
tata motor
ferrari motor
hundai motor

P.S:如果Full text无法使用LIKE,也欢迎使用{{1}}回答,这也应该支持多个单词。

5 个答案:

答案 0 :(得分:3)

一个非常简单的解决方案是按搜索字符串的位置排序:

SELECT * 
FROM `table` 
WHERE MATCH(`name`) AGAINST ('%motor' IN BOOLEAN MODE) 
ORDER BY INSTR(UPPER(`name`), UPPER('motor'))
LIMIT 10 

这会给你

motor
motor corp
tata motor
hundai Motor
ferrari motor

motor corp
motor
tata motor
hundai Motor
ferrari motor

如果您需要'motor'来到'motor corp'之前,那么添加另一个标准,如

ORDER BY INSTR(UPPER(`name`), UPPER('motor')), LENGTH(`name`)

答案 1 :(得分:0)

逐个使用特定优先次序。

SELECT * FROM view_sample
WHERE ...
ORDER BY 
  CASE 
    WHEN name LIKE 'motor%' THEN 2 
    WHEN name LIKE '%motor%' THEN 1 
    ELSE 0 END, 
 name
  1. 以马达为开头的一切
  2. 至少包含电机的所有内容
  3. 其他一切......
  4. 按名称排序

    在您的情况下,订购将是:

    motor
    motor corp
    ferrari motor
    hundai motor
    tata motor
    

答案 2 :(得分:0)

你可以使用一个联合,它首先用马达%选择结果,然后选择其他结果。

(select 1, name
   from carcomp
  where name like 'motor%')
union
(select 2, name
   from carcomp
  where name like '%motor%' 
    and not like 'motor%')
order by 1,2

答案 3 :(得分:-1)

不确定MySQL语法,但是类似于:

ORDER BY case when SUBSTRING(columnname,1,5) = 'motor' then 0 else 1 end

答案 4 :(得分:-1)

您可以使用instr()locate()按字母组中显示'motor'的位置来排序结果。

order by (name = 'motor') desc, instr(name, 'motor')

第一个句子首先放置完全匹配。

在您的情况下,订购将是:

motor
motor corp
tata motor
hundai motor
ferrari motor