【问题标题】:How to sort the results with reference to the keyword如何参考关键字对结果进行排序
【发布时间】:2013-11-22 06:53:14
【问题描述】:

我正在开发一个分类广告网站。为了搜索产品或公司,我在前面和后面都使用了通配符 (%)。

$keyword = "%".$user_keyword."%";

我正在使用以下 mysql 查询:

$query = "SELECT DISTINCT   login.id_user,  
                login.company,
                login.district,
                FROM login LEFT JOIN products 
                ON login.id_user = products.id_user
                WHERE   (login.district LIKE ? 
                    AND login.place LIKE ?)
                        AND
                    (login.company LIKE ?
                    OR login.summary LIKE ?
                    OR products.description LIKE ?)
                LIMIT ?, ?";    
                ";

这是有效的。但我想参考关键字对列表进行排序。 例如:如果用户搜索“foo”,可能会得到以下结果:

fool
kafoo
safoora
foo
foolan

我想将“foo”作为第一项

【问题讨论】:

标签: mysql sql sorting sql-order-by relevance


【解决方案1】:

请尝试以下操作:

$query = "SELECT DISTINCT   login.id_user,  
                login.company,
                login.district,
                FROM login LEFT JOIN products 
                ON login.id_user = products.id_user
                WHERE   (login.district LIKE ? 
                    AND login.place LIKE ?)
                        AND
                    (login.company LIKE ?
                    OR login.summary LIKE ?
                    OR products.description LIKE ?)
                order by if(LOCATE('$user_keyword', login.district)=0, 9999, LOCATE('$user_keyword', login.district))+
                         if(LOCATE('$user_keyword', login.place)=0, 9999, LOCATE('$user_keyword', login.place))+
                         if(LOCATE('$user_keyword', login.company)=0, 9999, LOCATE('$user_keyword', login.company))+
                         if(LOCATE('$user_keyword', login.summary)=0, 9999, LOCATE('$user_keyword', login.summary))+
                         if(LOCATE('$user_keyword', products.description)=0, 9999, LOCATE('$user_keyword', products.description))
                LIMIT ?, ?";    
                ";

【讨论】:

    【解决方案2】:

    如果您只需要完全匹配作为结果中的第一个出现,那么您应该在查询中添加如下内容:

    [...]
    ORDER BY
      CASE
        WHEN checked_column = 'keyword' THEN 1  /* exact match */
        ELSE 2  /* non-exact match */
      END,
      checked_column  /* sort non-exact matches */
    

    但是,如果您需要更复杂的排序,例如对结果进行评分以反映它们与给定关键字的相似程度,那么您正在寻找的概念称为edit distance

    【讨论】:

      猜你喜欢
      • 2018-04-12
      • 2011-09-24
      • 1970-01-01
      • 2014-10-02
      • 2014-01-08
      • 2021-06-29
      • 1970-01-01
      • 1970-01-01
      • 2011-11-30
      相关资源
      最近更新 更多