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

Rank PHP MySQL search results based on result sequence

我想改进 MySQL 搜索功能。在我的汽车数据库中搜索“Fi”时,我希望 FIAT 排在第一位,因为我觉得汽车品牌的排名应该高于车型。我想告诉 MySQL 如果搜索词与品牌的首字母相匹配,则首先优先考虑该结果。

{]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, ' ', v.model_version) LIKE ? LIMIT 6";

@user3783243 的评论是正确答案。如果你想用 mysql 来做,按照这些行定义一个排名列:4 * if(b.brand like ?, 1, 0) + 2 * if(v.model like ?, 1, 0) + if(v.model_version like ?, 1, 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, ' ', v.model_version) LIKE 'fi%' OR
            CONCAT(b.brand, ' ', v.model, ' ', v.model_version) LIKE '%fi%' OR
            CONCAT(b.brand, ' ', v.model, ' ', v.model_version) LIKE '%fi'
          ) ORDER BY case
              WHEN CONCAT(b.brand, ' ', v.model, ' ', v.model_version) LIKE 'fi%' THEN 1
              WHEN CONCAT(b.brand, ' ', v.model, ' ', v.model_version) LIKE '%fi%' THEN 2
              WHEN CONCAT(b.brand, ' ', v.model, ' ', v.model_version) LIKE '%fi' THEN 3
            ELSE 4 END
          LIMIT 6