如此简单的问题:我正在使用自己构建的自定义CMS为我的网站添加“相关帖子”。现在我正在尝试在单个SQL查询中完成它,它将返回3个顶级结果。我不使用标签顺便说一句。这是我到目前为止所提出的,并且它正在取得不错的结果,但我想以某种方式优先考虑标题与描述中出现的关键字。任何人都可以想到更好的方式吗?
SELECT * FROM db WHERE title LIKE "%keyword1%" OR title LIKE "%keyword2%" OR description LIKE "%keyword1%" OR description LIKE "%keyword2%" LIMIT 3;
答案 0 :(得分:1)
你可以用“案例”
来做SELECT *, case WHEN title like '%keyword1%' or title like '%keyword2%' THEN 1
ELSE 0 END as Priority
FROM db WHERE title LIKE '%keyword1%' OR title LIKE '%keyword2%' OR description LIKE '%keyword1%' OR description LIKE '%keyword2%' LIMIT 3 Order by Priority desc
所以如果标题包含关键字集Priority
为1,否则设置为0,然后按Priority
答案 1 :(得分:0)
UNION共有两个内部SELECT,一个用于关键字匹配,另一个用于描述匹配。在每个内部SELECT中,为关键字SELECT分配一个新的priority
列,值为1,为SELECT描述分配值为2。
然后,从UNIONed结果中,选择前3个ORDER BY priority
。
我给你的数据库/数据举个例子,不过你没有提供关于你正在使用什么数据库或你的数据是什么样的暗示。
答案 2 :(得分:0)
如果要优先排序,可以为每个LIKE匹配分配一些权重。像这样:
SELECT TOP 3 * FROM
(
SELECT *, 1 'Weight' FROM db WHERE title LIKE '%keyword1' OR title LIKE '%keyword2'
UNION
SELECT *, 2 'Weight' FROM db WHERE description LIKE '%keyword1' OR description LIKE '%keyword2'
)T1
ORDER BY Weight ASC
答案 3 :(得分:0)
如果您正在使用Oracle DB,那么您可以使用Oracle Text查询来非常有效地执行此类操作。它会让您根据与关键字的相关性对结果进行排名。