我目前正在处理一个必须提取
排序标题的查询这样的事情:
SELECT title
FROM title
WHERE title LIKE '%keyword%' OR LIKE '%keyword1%' OR LIKE '%keyword2%'
order by
case when title == 'keyword' then 0 else 1 end asc,
((title like '%keyword1%') + (title like '%keyword2%')) desc,
case when title like 'keyword1%' then 0 else 1 end asc,
title asc;
我测试了8个标题。
搜索:“Buford Christmas”。
结果:
Buford Christmas
圣诞节Buford
Buford先生
Buford先生
Buford和Lisa
Lisa Christmas
我圣诞节
Me Buford Lisa。
我需要找到一种方法来对标题进行排序,以便“Buford和Lisa”应该出现在“Buford先生”之前。
查询中的关键字可能包含任意数量的子关键字,导致MySQL语句中的代码动态更改。我的示例代码是使用包含2个子关键字的关键字生成的。似乎没有工作的部分是:“当'keyword1%'之类的标题然后0其他1结束asc时的情况”我想知道代码是否在逗号分隔的顺序序列中处于错误位置或者我应该分配不同的数字到'然后'和'其他'。
关于我的选择代码:
在我的select语句中,如果关键字是“Buford Christmas”,则会分为“Buford”,“Christmas”和“Buford Christmas”。
关于订购代码的这一部分:
((title like '%keyword1%') + (title like '%keyword2%')) desc,
MySQL将布尔表达式视为数字,其中true为1.因此,这会计算匹配数。
答案 0 :(得分:0)
select title
from books
where title like '%buford christmas%'
or title like '%buford%'
or title like '%christmas%'
order by
case
when
title = 'buford christmas' then 1
when
title like '%buford%' and title like '%christmas%' then 2
when
title like 'buford%' then 3
when
title like '%buford%' then 4
when
title like 'christmas%' then 5
when
title like '%christmas%' then 6
end
asc;
这将做你正在寻找的事情。显然在那里替换文字的变量。它优先考虑结果:
Books with title that EXACTLY matches the keywords
Books with titles that CONTAIN BOTH keywords
Books with titles that START with the first keyword
Books that CONTAIN the first keyword
Books that END with the last keyword
Books that CONTAIN the last keyword
演示:http://sqlfiddle.com/#!9/ec62a/7
修改强>
您可能还需要考虑全文索引,例如:create fulltext index ftx_title on books(title)
,然后您可以按原样运行查询:
select *
from books
where match(title)
against ('buford christmas' in boolean mode);
这会使您对关键字的查询变得更加简单