如何按最佳匹配排序
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
您甚至可以检索仅匹配 university
或 history
关键字的条目。
更新:
对于更复杂的搜索,最好实现 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>
然后只需在查询结束时按排名排序即可。
只要您继续添加,这将允许您按两个以上的描述进行排名。
考虑这个 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
您甚至可以检索仅匹配 university
或 history
关键字的条目。
更新:
对于更复杂的搜索,最好实现 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>
然后只需在查询结束时按排名排序即可。
只要您继续添加,这将允许您按两个以上的描述进行排名。