如何按关键字对结果进行排序

3

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

$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”作为第一个项目获取。

https://dev59.com/mVHTa4cB1Zd3GeqPQEh5 - Mihai
2个回答

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 ?, ?";    
                ";

0
如果你只需要确切匹配的结果出现在第一位,那么你应该在查询中添加类似这样的内容:
[...]
ORDER BY
  CASE
    WHEN checked_column = 'keyword' THEN 1  /* exact match */
    ELSE 2  /* non-exact match */
  END,
  checked_column  /* sort non-exact matches */

但是,如果您需要更复杂的排序,例如对结果进行评分以反映它们与给定关键字的相似程度,则您要寻找的概念称为编辑距离


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接