2011-10-12 32 views
0

所以很快问题:我正在为我的网站添加“相关帖子”,使用我自己构建的自定义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

UNION将两个内部SELECT一起使用,一个用于关键字匹配,另一个用于描述匹配。在这些内部SELECT中的每一个中,分配一个新的priority列,其中关键字SELECT为值1,描述SELECT为2。

然后,从UNIONed结果中,选择前3位ORDER BY priority

我会给你的数据库/数据的一个例子,除非你没有提供关于你正在使用的数据库或你的数据是什么样子的提示。

+0

这是SQLite和每个条目是一个职位..与标题,说明等 – Dendory

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 
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

0
订购吧

如果您碰巧使用Oracle DB,那么您可以使用Oracle Text查询非常有效地完成这类事情。它会让您根据关键字的相关性对结果进行排名。