【问题标题】:How to order by best match如何按最佳匹配排序
【发布时间】:2016-11-12 13:04:48
【问题描述】:

考虑这个OR 查询:

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

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

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

【问题讨论】:

    标签: mysql sql operator-keyword sql-order-by


    【解决方案1】:

    很简单,你可以使用简单的顺序子句来达到预期的效果:

    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 才是您问题的理想解决方案。

    【讨论】:

    • 什么意思?你能解释得更好吗?
    • 谢谢乔治。还有一个问题。在这个例子中,我只寻找 2 个条件。如果假设我有 5 个条件呢?
    • 您好,可能有一些解决方案,如果您可以应用全文搜索,最好的解决方案是:stackoverflow.com/questions/6259647/…
    【解决方案2】:

    尝试这样的事情:

    
    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
    

    然后在查询结束时按排名排序。

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

    【讨论】:

      猜你喜欢
      • 2013-09-14
      • 1970-01-01
      • 2021-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多