如何根据搜索词匹配的数量订购结果?

时间:2010-03-11 18:52:16

标签: search mysql

我在mysql中使用以下InnoDB表来描述可以有多个与之关联的搜索标记的记录:

TABLE records
    ID
    title
    desc

TABLE searchTags
    ID
    name

TABLE recordSearchTags
    recordID
    searchTagID

要根据任意搜索输入选择记录,我的语句看起来像这样:

SELECT 

    recordSearchTags.recordID

FROM 

    recordSearchTags

LEFT JOIN searchTags 

ON recordSearchTags.searchTagID = searchTags.ID 

WHERE 

    searchTags.name LIKE CONCAT('%','$search1','%') OR
    searchTags.name LIKE CONCAT('%','$search2','%') OR
    searchTags.name LIKE CONCAT('%','$search3','%') OR
    searchTags.name LIKE CONCAT('%','$search4','%');

我想对此结果集进行ORDER,以便与搜索字词匹配的行显示在与较少搜索字词匹配的行的前面。

例如,如果一行匹配所有4个搜索词,则它将位于列表的顶部。只匹配2个搜索词的行将在中间的某个位置。只匹配一个搜索词的行将在最后。

有关最佳方法的建议是什么?

谢谢!

2 个答案:

答案 0 :(得分:1)

*替换了答案,因为全文不是一个选项

好吧,它不漂亮,但你应该可以这样做:

ORDER BY (searchTags.name LIKE CONCAT('%','$search1','%') 
          + searchTags.name LIKE CONCAT('%','$search2','%')
          + searchTags.name LIKE CONCAT('%','$search3','%')
          + searchTags.name LIKE CONCAT('%','$search4','%'))
DESC;

LIKE会在匹配时返回10如果没有匹配,那么您应该只能将结果添加到一起。

答案 1 :(得分:0)

这不是很漂亮,但一种方法是在4个语句中合并4个喜欢,比如

select ... where  searchTags.name LIKE CONCAT('%','$search1','%')
union 
select ...

等等。将其包裹在:

select recordSearchTags.recordID, count(*) from (<inner unions>)
group by recordSearchTags.recordID 
order by count(*)