问题描述
我想改进我的 MysqL 搜索功能。在我的汽车数据库中搜索“Fi”时,我希望菲亚特排在第一位,因为我觉得汽车品牌的排名应该高于车型版本。我想告诉 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_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