根据最长匹配

时间:2015-05-29 15:38:29

标签: php mysql

我有一个包含项目关键字的数据库表。每个项目都有几个关键字。

在Web应用程序中,用户可以通过输入多个要搜索的关键字来执行搜索。如果用户输入(例如)四个关键字,我想将搜索结果作为项目列表返回。应首先根据最长的匹配对项目进行排序。列出的第一个项目将是所有四个关键字匹配的项目,其次是与四个关键字中的三个匹配的项目等。

我可以写什么查询来返回结果?

这是我认为查询的样子的粗略概念:

select projectID 
  from project_keyword 
 where keyword = '*keyword1*' 
    or keyword = '*keyword2*'
    or keyword = '*keyword3*'

但我想要的是任何projectID匹配要首先显示的所有三个关键字(如果有),然后是匹配三个关键字中的两个的projectID,等等。{{1}不会返回任何匹配的关键字。

示例:

projectID

对于' salsa',' tamale',' burrito'的用户关键字搜索,查询应按此顺序返回这些projectID。

projectID  keyword 
---------  -------
 456       salsa
 456       guacamole
 456       tamale
 511       salsa
 511       tamale
 511       burrito
 511       taco
 654       margarita
 654       nachos
 789       margarita
 789       salsa  
 789       taco

如何从指定顺序返回的查询中获取行? (我可以写什么查询来获得它。)

1 个答案:

答案 0 :(得分:1)

这样的事情应该有效:

 SELECT k.projectID
   FROM project_keyword k
  WHERE k.keyword IN ('*keyword1*','*keyword2*','*keyword3*')
  GROUP BY k.projectID
  ORDER BY COUNT(DISTINCT k.keyword) DESC, k.projectID

(这假设该表包含projectID的多行,每个关键字一行。如果不是表的组织方式,如果它是单行,并且您正在寻找匹配在列中某处出现的关键字,我们需要不同的查询。)

如果要返回匹配的关键字列表,可以在SELECT列表中使用GROUP_CONCAT聚合

 SELECT k.projectID
      , GROUP_CONCAT(DISTINCT k.keyword ORDER BY k.keyword) AS keywords_matched
   FROM ...