加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 如何在使用LIKE时按大多数匹配对MySQL结果进行排序

发布时间:2020-12-13 21:52:02 所属栏目:PHP教程 来源:网络整理
导读:我目前正在处理一个必须显示特定表中所有文章列表的查询,但它必须根据搜索表单对列表进行排序,以便首先显示包含最多/最佳匹配的文章,然后显示根本没有任何匹配将按字母顺序排序. 我已经使这个代码工作得很好,虽然我找不到按大多数匹配/相关性对匹配进行排序
我目前正在处理一个必须显示特定表中所有文章列表的查询,但它必须根据搜索表单对列表进行排序,以便首先显示包含最多/最佳匹配的文章,然后显示根本没有任何匹配将按字母顺序排序.

我已经使这个代码工作得很好,虽然我找不到按大多数匹配/相关性对匹配进行排序的方法.

这是我的代码:

$search = $_POST["searhwords"];
$search = preg_replace('/s+/',' ',$search);

$SearchQueryArray = str_replace(",","",$search);
$SearchQueryArray = str_replace(" ",$SearchQueryArray);
$SearchQueryArray = explode(',',$SearchQueryArray);


$outputtt1 = '';
$outputtt2 = '';
foreach ( $SearchQueryArray as $queryword )
{
    $outputtt1 .= "title LIKE '%".$queryword."%' OR ";  
    $outputtt2 .= "title NOT LIKE '%".$queryword."%' AND ";  
}

$outputtt1 = rtrim($outputtt1,' OR ');
$outputtt2 = rtrim($outputtt2,' AND ');




$query_for_result = mysql_query("SELECT * from mytable 
WHERE ".$outputtt1."
union all
SELECT * from mytable 
WHERE ".$outputtt2."
");

所以我需要找到一种方法来对包含匹配项的文章进行排序,以便首先对包含大多数匹配项的文章进行排序.

你可以看到我在这里制作的剧本:
http://www.genius-webdesign.com/test/querytest.php

解决方法

这是执行此操作的SQL:

select t.*
from mytable
order by ((title like '%keyword1%') +
          (title like '%keyword2%') +
          (title like '%keyword3%') +
          . . .
          (title like '%keywordn%')
         ) desc;

MySQL将布尔表达式视为数字,其中true为1.因此,这会计算匹配数.

顺便说一句,如果您的数据有任何大小,您可能会发现全文搜索比使用类似更有效.

编辑:

计算关键字的数量更具挑战性,但您可以这样做:

order by ((length(replace(title,'keyword1','x')) -
           length(replace(title,'')
          ) +
          (length(replace(title,'keyword2','')
          ) +
          . . .
          (length(replace(title,'keywordn','')
          )
         );

计算关键字的出现次数比仅查找其存在的位置更麻烦.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读