根据结果顺序对搜索结果进行排名 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
我想改进 MySQL 搜索功能。在我的汽车数据库中搜索“Fi”时,我希望 FIAT 排在第一位,因为我觉得汽车品牌的排名应该高于车型。我想告诉 MySQL 如果搜索词与品牌的首字母相匹配,则首先优先考虑该结果。
{
这是我当前的代码
$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