Php 按一组关键字的出现情况对sql结果排序

Php 按一组关键字的出现情况对sql结果排序,php,mysql,sql,sorting,keyword-search,Php,Mysql,Sql,Sorting,Keyword Search,我正在尝试为我的网站做一个小搜索引擎。 首先,用户键入一些关键字并转到使用以下代码的结果页面: $result = array(); $keyword_tokens = explode(' ', $keywords); $keyword_tokens = array_map( function($keywords) { return mysql_real_escape_string(trim($keywords)); }, $keyword_tokens

我正在尝试为我的网站做一个小搜索引擎。 首先,用户键入一些关键字并转到使用以下代码的结果页面:

$result = array();
$keyword_tokens = explode(' ', $keywords);
$keyword_tokens = array_map(
    function($keywords) {
        return mysql_real_escape_string(trim($keywords));
    }, 
    $keyword_tokens
);
$sql = "SELECT * FROM search_table WHERE concat(title, description) LIKE '%";
$sql .= implode("%' OR concat(title, description) LIKE '%", $keyword_tokens) . "%' ORDER BY instr(description, '$keywords') DESC, instr(title, '$keywords') DESC";
$result=mysql_query($sql);
这段代码允许搜索用户请求的关键字,并按$keywords排序,因此按关键字组的完整精确字符串

我试图做的是按每个关键字的最新出现次数对结果排序。 例如,如果我的sql结果的一行包含5个关键字,另一行包含3个关键字,等等。。这5个关键词应该首先出现。我正在搜索按更多关键字匹配对结果进行排序

希望一切都可以理解


非常感谢您的帮助

MySQL的可爱之处,取决于你的观点。它以它认为您希望的方式处理数据<代码>1+“1”?很明显,您希望将字符串视为一个数字,因此它很乐意为您执行加法

也适用于布尔操作数(只需注意运算符的优先级)
(类似于“%foo%”)+(类似于“%bar%”)
识别数值上下文,将布尔结果
true
视为
1
,将布尔结果
false
视为
0
——基本上为您计算关键字匹配

你怎么能用这个?以
where
子句为例,将所有
替换为
+
,并确保每个
类似的
语句都用括号括起来,然后按
排序

例如:

使用
全文索引
可以实现类似的功能,但权重可能有点奇怪。其语法如下:

create fulltext index idx on search_table(title, description)
^^那就做一次

select *
  from search_table
  where match(title, description) against ('keyword1 keyword2 ...')
  order by match(title, description) against ('keyword1 keyword2 ...') desc
这有一个严重的好处,那就是构造查询的麻烦要小得多


这说明了这两种方法。(虽然只针对一列-但它能表达观点)

也许看一下全文索引我不明白你的问题???。如果用户键入关键字,键入最多的结果应该排在第一位???。这是你的问题吗?嗨,用户选择发送到搜索页面的表单中的$keywords。我正在搜索按更多关键字匹配对结果进行排序。全文索引可能是实现这一点的最简单方法,或者您可以按如下所示构建动态
排序
select *
  from search_table
  where match(title, description) against ('keyword1 keyword2 ...')
  order by match(title, description) against ('keyword1 keyword2 ...') desc