如何按最佳匹配排序

How to order by best match

考虑这个 OR 查询:

SELECT * FROM course WHERE description LIKE '%university%' OR description LIKE '%history%'

显然,我想首先查看两个条件都为真的记录,即同时包含 'university''history' 的记录,然后是仅包含其中一个的记录。

当我想把 LIMIT 放在那里时,这尤其重要。 知道如何在不遍历所有结果的情况下做到这一点吗?

这很简单,您可以使用简单的 order 子句来获得所需的结果:

SELECT * FROM course
WHERE description LIKE '%university%' OR description LIKE '%history%'
ORDER BY IF(description LIKE '%university%' and description LIKE '%history%', 0, 1)
LIMIT 0, 20

您甚至可以检索仅匹配 universityhistory 关键字的条目。

更新:

对于更复杂的搜索,最好实现 MySQL 的 MATCH AGAINST 功能,请参阅:否则 LIKE 子句不允许 IN 语句。您也可以像这样使用 REGEXP:MySQL match() against() - order by relevance and column?

对于其他一些示例,您可以像这样在 WHERE 子句中使用 REGEXP:

WHERE description REGEXP 'university|history|literature'

但在这种情况下,您仍然必须像我给出的第一个示例一样为 ORDER 子句构建相同的查询。

无论如何,如果您动态构建此字符串,这并不难,但在这种情况下,ORDERing 会变得复杂。只有 MATCH AGAINST 是您问题的理想解决方案。

尝试这样的事情:


select 
case 
when description like '%university%' and description like '%history%' then 2
when description like '%university%' then 1 
when description like '%history%' then 1 else 0 end as rank
</pre>

然后只需在查询结束时按排名排序即可。

只要您继续添加,这将允许您按两个以上的描述进行排名。