根据结果​​序列对 PHP MySQL 搜索结果进行排名

问题描述

我想改进我的 MysqL 搜索功能。在我的汽车数据库搜索“Fi”时,我希望菲亚特排在第一位,因为我觉得汽车品牌的排名应该高于车型版本。我想告诉 MysqL 搜索词是否与品牌的第一个字母匹配,然后优先考虑该结果。

{

My Search results

]1

这是我当前的代码

$sql = "SELECT v.id,v.model,v.model_version,v.model_year,b.brand FROM vehicles v LEFT JOIN brands b ON v.brand_id = b.id WHERE CONCAT(b.brand,' ',v.model_version) LIKE ? LIMIT 6";

解决方法

@user3783243 的评论是正确的答案。如果你想用 mysql 来做,按照这些行定义一个排名列:4 * if(b.brand like ?,1,0) + 2 * if(v.model like ?,0) + if(v.model_version like ?,0) as 'rank'。它很快变得棘手。假设模型上有精确的马赫,但品牌上有部分匹配。部分品牌真的应该排名更高吗?

,

我找到了我认为非常有效的最佳答案。由于全文搜索最多只能索引 4 个字符(除非您更改服务器设置),这可能会很麻烦。

这是我的方法:

SELECT v.id,v.model,v.model_version,v.model_year,b.brand FROM vehicles v
          LEFT JOIN brands b ON v.brand_id = b.id
          WHERE (
            CONCAT(b.brand,' ',v.model_version) LIKE 'fi%' OR
            CONCAT(b.brand,v.model_version) LIKE '%fi%' OR
            CONCAT(b.brand,v.model_version) LIKE '%fi'
          ) ORDER BY case
              WHEN CONCAT(b.brand,v.model_version) LIKE 'fi%' THEN 1
              WHEN CONCAT(b.brand,v.model_version) LIKE '%fi%' THEN 2
              WHEN CONCAT(b.brand,v.model_version) LIKE '%fi' THEN 3
            ELSE 4 END
          LIMIT 6