我在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个搜索词的行将在中间的某个位置。只匹配一个搜索词的行将在最后。
有关最佳方法的建议是什么?
谢谢!
答案 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
会在匹配时返回1
或0
如果没有匹配,那么您应该只能将结果添加到一起。
答案 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(*)