我有一个包含项目关键字的数据库表。每个项目都有几个关键字。
在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
如何从指定顺序返回的查询中获取行? (我可以写什么查询来获得它。)
答案 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 ...